在TeamCity构建脚本中使用百分号

41
我正在尝试设置一个TeamCity构建过程,运行一个自定义的命令行脚本。该脚本使用一个变量,因此需要一个百分号(例如%x)。但是,TeamCity用于其属性的百分号(例如%build.number%),因此脚本中的百分号在运行时会被删除。
如果脚本包含以下内容:
for /d %x in ("c:\*") do @echo "%x"

实际运行的是这个:

for /d x in ("\*") do @echo "x"

我该如何编写脚本,以便可以包含变量?


TeamCity不会触碰代理机器上运行的文件;你确定是TC弄错了百分比吗? - Adam Vandenberg
1
我试图使用自定义脚本而不是单独的文件。将其移动到文件中有所帮助。 - tspauld
3个回答

70

如果您想将%传递给TeamCity,您应该使用另一个%进行转义,即对于%必须是%%

但是Windows命令行将%视为转义字符,因此您应该再次转义它,在每个%之前添加另一个%,即对于%%,您应该传递%%%%

流程如下:

%%%% in cmd -> %% in TeamCity -> % actual sign.

简述:你问题的答案将会是:

for /d %%%%x in ("c:\*") do @echo "%%%%x"

嗨Marat,你的回答帮助我在命令行构建步骤中避免了%。但我仍然不明白为什么需要传递4个%符号,当%%应该可以转义符号时?你有任何链接到解释这个问题的文档吗? - Newbee
2
@Newbee,这里有两层转义。第一层是TeamCity,第二层是命令行。因此,如果你将%%%%传递给TeamCity,它会将其解释为%%并将其传递给命令行。然后命令行会将%%解释为%。 - Aura

35

尝试使用for /d %%x in ("c:\*") do @echo "%%x"命令(即复制%号)。

但是应该有一种方法告诉TC不要动这个文件。如果TC删除源代码中的百分号,那将是可怕的。因此,我相信您在配置中做了一些事情,以启用对%的替换。

类似地,真的是TC搞乱了脚本吗?还是您正在使用构建工具来生成脚本之类的东西?


我最初尝试使用自定义脚本而不是单独的文件,并尝试了重复百分号,但没有成功。但在单独的文件中使用它们是有效的。 - tspauld
7
我能将其作为自定义脚本运行,只需将百分号重复三次即可。 - tspauld
仍然必须有一个原因导致您的脚本损坏。哪个程序扩展了“%build.number%”?它真的是TC吗?如果是这样,那么一定有关闭它的选项。如果您需要构建号码,我建议将其放入不同的脚本中,并通过“call”读取它。 - Aaron Digulla
3
天哪!我整天都在尝试弄明白它。非常感谢你! - Allan Spreys

4
似乎TeamCity只是将您输入的内容放入一个 .cmd 文件中。 在这些情况下,for语句需要使用双百分号。 然后,TeamCity似乎会删除其中一个%符号,这就是tspauld让它工作的方式(这也是我让它运行的方式)。
日志显示,TeamCity在这里创建了一个文件:Program Files\TeamCity\buildAgent\temp\agentTmp,但for cmd执行得太快,无法查看它写了什么。假设第一行是长时间执行的任务,则可以检查此文件(令人烦恼的是,“暂停”不起作用)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接