Powershell(?)以非常奇怪的方式转换参数-从字符串中删除逗号

时间:2018-09-21 15:25:08

标签: powershell teamcity

我在TeamCity中有一个Powershell构建步骤:

param ([string] $a)

Write-Host "`$a is '$a'."

,在这一步中,我将参数$a设置为-a "%TestParam%""-a %TestParam%",其中TestParam有两行abracadabra

运行构建时,我得到以下输出:

[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'.

1 个答案:

答案 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",这可以解释这种混乱。