Mongodb 为什么';此msiexec.exe命令是否在powershell中工作?

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

我正试图通过powershell在高级安装程序生成的安装程序调用的脚本中执行以下命令。问题是,当脚本执行时,调用MSIEXEC.exe时,它会阻塞。更具体地说,它会在msiexec帮助屏幕上显示一个windows对话框

好吧,也许它不喜欢高级安装程序执行它的方式。因此,我采用了引起问题的实际线路:

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卸载
在所有情况下,我都会得到该死的“帮助”对话框。唯一有区别的是,如果我不使用INSTALLLOCATION和ADDLOCAL选项。(这些显然是根据此处的“无人值守安装第2部分”使用的:)。在这种情况下,它只是安静地退出,没有安装任何东西

老实说,整个下午我都头撞墙,真是不知所措

顺便说一句,我之所以以如此荒谬的方式安装mongo,是因为我需要一种为我公司的产品提供单一安装系统的方法。这取决于Mongo,我们必须让它作为服务器运行并使用身份验证,所以我必须有脚本来创建管理员和数据库用户,并将其置于身份验证模式。因为我需要知道mongo的安装位置(执行mongod.exe和mongo.exe),所以我需要首先向用户查询位置,然后将安装位置传递给mongo安装程序。如果我完全偏离了轨道,请告诉我有更好的方法。 谢谢


编辑:我忘了提到我编写了完整的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+
    ie
    帮助函数(在PSv5+中,使用的
    安装模块本机
    ),该函数在内部补偿所有损坏的行为,并允许按预期传递参数;也就是说,只需将
    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通过转换参数