我正在尝试通过powershell在由Advanced Installer生成的安装程序调用的脚本中执行以下命令。问题是,当脚本执行时,它会在调用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中执行此操作时,我仍然会获得相同的愚蠢帮助屏幕。我尝试了这个命令行的每个可能的变体:
在所有情况下,我都会得到该死的“帮助”对话框。唯一可能产生影响的是,如果我不使用INSTALLLOCATION和ADDLOCAL选项。 (这些显然按照“无人值守安装第2部分”使用:https://docs.mongodb.com/tutorials/install-mongodb-on-windows/)。在这种情况下,它只是安静地退出而不安装任何东西。
老实说,我整个下午一直在靠墙撞击我的智慧。
顺便说一下,我以这种荒谬的方式安装mongo的原因是我需要一种为我公司的产品安装单一安装系统的方法。它取决于Mongo,我们必须让它作为服务器运行并使用身份验证,因此我必须有脚本来创建管理员和数据库用户并将其置于身份验证模式。由于我需要知道mongo的安装位置(执行mongod.exe和mongo.exe),我需要先查询用户的位置,然后将安装位置传递给mongo安装程序。如果我完全不在这里,请让我知道有更好的方法。 感谢
编辑:我忘了提到我编写完整的PowerShell脚本并在尝试通过高级安装程序执行它之前对其进行了测试。该脚本一直有效,直到我尝试通过安装程序运行它。奇怪的是我现在仍然无法手动执行命令。
答案 0 :(得分:3)
似乎为了将嵌入空间的路径传递给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'
请注意, msiexec
,尽管有CLI(命令行界面),但是 GUI - 子系统应用程序,因此运行< em>异步默认情况下;如果您希望同步运行,请使用
Start-Process -Wait
强>:
$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 = Start-Process -PassThru -Wait msiexec -ArgumentList $msiArgs
# $ps.ExitCode contains msiexec's exit code.
[1] INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\'
无效的原因是PowerShell将参数转换为"..."
- 引用作为整体, msiexec
无法识别;具体而言,在这种情况下传递给msiexec
的是:
"INSTALLLOCATION=C:\Program Files\MongoDB\Server\3.4\"