2

我试图在包含空格的值的installshield安装程序中设置公共属性。在运行MSI安装程序时,我在PowerShell命令提示符下使用以下命令。由于值包含空格所以就用双引号来传递值msiexec的命令行参数在PowerShell中如果包含空格,会中断

msiexec -i "myinstaller.msi" MYDIRPATH="C:\new folder\data.txt" 

它突破命令作为参数值C:\new folder\data.txt具有串new folder中和的空间中MSIEXEC的下面的错误提示的结果,其是暗示的事实参数传递给msiexec命令是有问题的:

enter image description here

如果我在Windows默认命令外壳运行非常相同的命令提示符,然后它的工作原理就像一个魅力。

,我试过的选项:

  1. 代替双引号
  2. 在参数按this答案使用反勾号(')字符空格前的使用单引号。

回答

4

在PowerShell中

msiexec -i "myinstaller.msi" MYDIRPATH=`"C:\new folder\data.txt`" 

转义字符尝试是严重的口音(`)。

+0

太可怕了!不是在我的梦中,我可以想象得到。非常感谢帮助。我有更多的细节[这里](https://serverfault.com/questions/47811/what-is-the-literal-escape-character-in-powershell)供参考。 – RBT

3

补充Marko Tica's helpful answer

调用外部公用事业PowerShell是非常困难的,因为PowerShell中,已经完成后的自己第一解析,重建,实际上是调用幕后的命令行,并且很明显应用了哪些规则。

为了解决这个问题,PSv3 +提供--%, the stop-parsing symbol,这是一个完美的契合在这里,因为在命令行中包含了PowerShell的变量或子表达式的引用:这通过命令行的其余部分-is到外部程序,节省%...%风格的环境变量的扩张潜力:

# Everything after --% is passed as-is. 
msiexec --% -i "myinstaller.msi" MYDIRPATH="C:\new folder\data.txt" 

至于实际上在原来的尝试发生了什么:

PowerShell的翻译
MYDIRPATH="C:\new folder\data.txt"
"MYDIRPATH=C:\new folder\data.txt"幕后 - 注意整个令牌现在是如何封闭在"..."

可以说,这两种形式应该被认为相当于通过msiexec,但所有的赌注都关闭在Windows命令行参数解析的无政府的世界。

+1

酷! 'msiexec - %-i“myinstaller.msi”MYDIRPATH =“C:\ new folder \ data.txt”'也适用。事实上,这是一个比将奇妙的倒勾字符作为转义序列更清晰的解决方案。 – RBT

+1

@RBT:确实:因为在你的情况下,你根本不需要PowerShell来解释命令行,' - %'是最简单的。 – mklement0

+1

是的。事实上,实际上我有几个'msiexec'的命令行参数,它们可以有空格。我只显示一个命令行参数,以确保我的文章简单。当有几个命令行参数可能存在空间的时候,应用反向tick转义序列将成为一场噩梦。 – RBT

相关问题