在命令行上设置公共属性值

时间:2018-08-09 17:49:07

标签: powershell wix windows-installer parameter-passing quoting

Setting Public Property Values on the Command Line的msi遵循该模式

MyInstaller.msi PUBLICPROPERTY="someValue"

这适用于“命令提示符”,也称为cmd.exe和Powershell。

但是

MyInstaller.msi PUBLICPROPERTY=""

不能像Powershell中那样正常工作。我希望它将PUBLICPROPERTY设置为null,但将PUBLICPROPERTY设置为值“ CURRENTDIRECTORY =“ C:\ temp \ msi \”“(它的确与cmd.exe一样工作)。

powershell和cmd.exe的行为为何不同,如何解决?

1 个答案:

答案 0 :(得分:3)

PowerShell,在必要的Windows上,对您的论点进行幕后重新引用

这种不可见的重新引用并非总是按预期运行,例如在这种情况下。

您可以通过调整报价来解决问题:

... PUBLICPROPERTY=`"`"  # `-escape the " chars.

... 'PUBLICPROPERTY=""'  # use enclosing '...', so " chars. can be used as-is

请注意,如果要在参数中包含PowerShell变量/表达式的值,则无法使用'...'

此外,在PSv3 +中,您可以使用--%, the stop-parsing symbol使PowerShell 按原样传递其余参数,就像您从cmd.exe /批处理文件中调用 (包括扩展环境变量引用,例如%OS%)。

... --% PUBLICPROPERTY=""

同样,您将无法以这种方式在参数中引用PowerShell变量或表达式。


关于没有上述技术的情况:

  • PUBLICPROPERTY="someValue"成为
    PUBLICPROPERTY=someValue

  • PUBLICPROPERTY="some Value"由于空格而变得
    "PUBLICPROPERTY=some Value",即 entire参数包含在"..."中。

PowerShell- 内部诸如PUBLICPROPERTY="someValue"之类的参数用引号引起来 stripped :如果将这样的参数传递给PowerShell cmdlet或函数,它将看到只是PUBLICPROPERTY=someValue

在将这样的值传递给外部程序时,PowerShell会根据情况决定 是否需要双引号,但是该引号仅适用于整个参数-"字符的初始位置。迷路了。

因此,PUBLICPROPERTY="someValue"变成PUBLICPROPERTY=someValue并按原样通过 传递,因为它不包含任何嵌入式空格,因此PowerShell不应用双引号。

相反,PUBLICPROPERTY="some Value"变成PUBLICPROPERTY=some Value,并以"PUBLICPROPERTY=some Value"的形式传递,因为空白的存在需要双引号才能将值保留为单个参数。

请注意, PowerShell仅对传递给外部程序的参数应用 double 引用,因为这是唯一可以被所有人理解的引用样式程序。

由于向后兼容性问题,重新报价逻辑随时间而变化,并且具有bugs, which, regrettably, are here to stay

例如,'3 " of rain'变成"3 " of rain",这是的原因,因为嵌入"缺少转义;解决方法是预期并明确地执行PowerShell应该自动执行的操作:自动将嵌入式"转换为\",以使外部程序受益:'3 \" of rain'