我在TeamCity中有一个Powershell构建步骤:
param ([string] $a)
Write-Host "`$a is '$a'."
,在这一步中,我将参数$a
设置为-a "%TestParam%"
或"-a %TestParam%"
,其中TestParam有两行abra
和cadabra
。
运行构建时,我得到以下输出:
[Step 1/10] PowerShell arguments: -NoProfile, NonInteractive, -ExecutionPolicy, ByPass, -File, C:\buildAgent\temp\buildTmp\powershell1746295357460795314.ps1, -a, "abra, cadabra"
[Step 1/10] $a is 'abra cadabra'.
我唯一的问题:逗号到底发生了什么?为什么它消失了?
如果我根本不使用引号(-a %TestParam%
),那么TeamCity将每一行作为单独的参数传递,我会看到$a is 'abra'.
。
答案 0 :(得分:1)
Mathias R. Jessen's answer解释了PowerShell将,
分隔的标记解析为参数[他的答案此后已被删除,但我希望它不会被删除],但是不适用于当前情况,因为通过-File
传递到PowerShell CLI的任何参数不都受PowerShell命令行解析的约束-相反,这样的论点被视为 literals 。
也就是说, if TeamCity真正调用的命令行如下:
powershell ... -File C:\...ps1 -a "abra, cadabra"
然后参数变量$a
将接收到值abra, cadabra
,如预期的那样。
换句话说:您的案件中所传递的实际上必须是abra cadabra
,而不是
abra, cadabra
,因此您需要修改%TestParam%
的值以确保它实际上包含所需的逗号。
关于 为什么所调用命令的 log 表示存在 ,
通过的内容:
根据您自己的猜测,我只能推测:
我怀疑TeamCity是骗子,显示带有逗号的行,但没有逗号就通过了。
也许 TeamCity,在记录命令行调用时,仅通过空白天真地将该命令行拆分为令牌,而没有考虑引用 ,然后将其显示为,
分隔的列表。
如果确实如此,则参数"abra cadabra"
(不带逗号)将记录为
"abra, cadabra"
,这可以解释这种混乱。