我尝试使用包含空格的值在installshield安装程序中设置公共属性。在运行MSI安装程序时,我在PowerShell命令提示符下使用以下命令。由于该值包含空格,因此我使用双引号传递值
msiexec -i "myinstaller.msi" MYDIRPATH="C:\new folder\data.txt"
它打破了命令,因为参数值C:\new folder\data.txt
在字符串new folder
中有一个空格并导致msiexec的错误提示低于下方,这表明传递给msiexec命令的参数存在问题:
如果我在Windows默认命令shell提示符下运行相同的命令,那么它就像魅力一样。
我尝试过的选项:
答案 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等待,直到程序完成安装在继续前进之前。