Mongodb 为什么';此msiexec.exe命令是否在powershell中工作?
我正试图通过powershell在高级安装程序生成的安装程序调用的脚本中执行以下命令。问题是,当脚本执行时,调用MSIEXEC.exe时,它会阻塞。更具体地说,它会在msiexec帮助屏幕上显示一个windows对话框 好吧,也许它不喜欢高级安装程序执行它的方式。因此,我采用了引起问题的实际线路:Mongodb 为什么';此msiexec.exe命令是否在powershell中工作?,mongodb,powershell,windows-installer,Mongodb,Powershell,Windows Installer,我正试图通过powershell在高级安装程序生成的安装程序调用的脚本中执行以下命令。问题是,当脚本执行时,调用MSIEXEC.exe时,它会阻塞。更具体地说,它会在msiexec帮助屏幕上显示一个windows对话框 好吧,也许它不喜欢高级安装程序执行它的方式。因此,我采用了引起问题的实际线路: msiexec.exe /q /i 'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' INSTALLLOCATION
msiexec.exe /q /i 'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' ADDLOCAL='all'
当我直接在powershell中执行此操作时,仍然会看到相同的愚蠢帮助屏幕。我已经尝试了此命令行的所有可能的变体:
- /a和/被动而不是/i和/q
- 双引号
- 单引号
- msi没有报价
- 在管理员提升的shell中
- 在普通特权外壳中
- msi位于桌面而不是临时文件夹上
- 如果已安装,则使用/x卸载
编辑:我忘了提到我编写了完整的powershell脚本,并在尝试通过高级安装程序执行之前对其进行了测试。在我尝试通过安装程序运行脚本之前,脚本一直有效。奇怪的是,我现在仍然无法手动执行该命令。似乎为了将带有嵌入空格的路径传递给
msiexec
,必须使用显式嵌入的“…”
对其进行引用。
在您的情况下,这意味着不是通过INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\'
,您必须通过INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\\\'
[1]
注意路径末尾嵌入的“…”
和额外的\
,以确保\“
本身不会被msiexec
误认为是转义的”
(尽管它也可以在没有额外的\
的情况下工作)
总而言之:
msiexec.exe/q/i`
'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi'`
INSTALLLOCATION='“C:\Program Files\MongoDB\Server\3.4\\”'ADDLOCAL='all'
警告:
- 这种嵌入式引用技术r依赖于长期存在但已损坏的PowerShell行为-参见;一旦修复,该技术将停止工作;相比之下,
下面显示的方法将继续有效-->%
- 一种无需解决的、经得起未来考验的方法是使用中的PSv3+
帮助函数(在PSv5+中,使用的ie
),该函数在内部补偿所有损坏的行为,并允许按预期传递参数;也就是说,只需将安装模块本机
预先添加到原始命令即可:ie
#使用“本机”模块中的“ie”功能无需解决任何问题。
ie msiexec.exe/q/i'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi'INSTALLLOCATION='C:\Program Files\MongoDB\server\3.4\'ADDLOCAL='all'
替代方法是坚持原始引用并使用
-%
,但请注意,这意味着您不能在所有后续参数中使用PowerShell变量:
msiexec.exe/q/i`
'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi'`
--%INSTALLLOCATION=“C:\Program Files\MongoDB\Server\3.4\\”ADDLOCAL='all'
请注意,
msiexec
,尽管有CLI(命令行界面),但它是一个GUI子系统应用程序,因此默认情况下它异步运行;如果希望同步运行,请使用启动流程-等待
:
$msiArgs='/q/i“C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi”INSTALLLOCATION=“C:\Program Files\MongoDB\server\3.4\\”ADDLOCAL=all”
$ps=启动进程-PassThru-Wait msiexec-ArgumentList$msiArgs
#$ps.ExitCode包含msiexec的退出代码。
请注意,参数列表字符串$msiArgs
,作为用于调用目标程序(msiexec
)的命令行的一部分,按原样由启动进程使用,这意味着:
- 只能使用(嵌入式)双引号
- 使用
“…”
和嵌入的“
转义为`
在字符串中嵌入PowerShell变量和表达式
- 然而,与此相反,对于部分引用的参数,不需要任何变通方法
尽管Start Process
在技术上支持将参数作为数组单独传递,但由于存在一个长期的错误,最好避免这种情况-请参阅
[1] INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\'
不起作用的原因是PowerShell通过转换参数