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的行为为何不同,如何解决?
答案 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'