msiexec的命令行参数如果包含空格则在powershell上中断

时间:2017-06-12 11:27:43

标签: powershell windows-installer command-line-arguments installshield msiexec

我尝试使用包含空格的值在installshield安装程序中设置公共属性。在运行MSI安装程序时,我在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默认命令shell提示符下运行相同的命令,那么它就像魅力一样。

我尝试过的选项:

  1. 使用单引号代替双引号
  2. 根据this回答在参数中的空格前使用反向刻度(`)字符。

3 个答案:

答案 0 :(得分:6)

尝试使用

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

PowerShell中的转义字符是重音符号(`)。

答案 1 :(得分:5)

补充 Marko Tica's helpful answer

在PowerShell中调用外部实用程序非常困难,因为PowerShell在完成自己的解析之后,重建实际调用的命令行场景,并且很明显应用了哪些规则。

为了解决这个问题, PSv3 + 提供 --%, the stop-parsing symbol ,这是完美的选择,因为命令行不包含对PowerShell变量的引用或子表达式:将命令行的其余部分按原样传递给外部实用程序,除了%...%样式环境变量的潜在扩展

 # 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命令行参数解析的无政府世界中,所有的赌注都是关闭的。

答案 2 :(得分:0)

这是通常使用Powershell安装程序的最佳方法。

这是我自己的脚本中的一个示例:

start-process "c:\temp\SQLClient\sqlncli (x64).msi" -argumentlist "/qn IACCEPTSQLNCLILICENSETERMS=YES" -wait

使用Start-Process "Path\to\file\file.msi or .exe" -argumentlist (Parameters) "-qn or whatever" -wait

现在 -wait 很重要,如果您的脚本中安装了许多程序,则wait命令(如管道到Out-Null的管道)将强制Powershell等待,直到程序完成安装在继续前进之前。