作为安装例程的一部分,我需要静默运行命令。
我需要运行的命令如下:
"c:\Program Files (x86)\MPSAuditTool\v1\mrt.exe" /s /v"cmd=silent"
现在我知道的最后一部分是一个问题,试图通过带引号字符的普通exe命令传递它。我的各种谷歌搜索让我尝试使用VBS来实现这一目标。
我的vbs
Public Function runQuiet()
Dim oShell
Set oShell = CreateObject ("WScript.Shell")
oShell.run("cmd.exe c:\Program Files (x86)\MPSAuditTool\v1\mrt.exe /s /v"), 0
Set oShell = Nothing
End Function
我的WiX代码供参考:
<InstallExecuteSequence>
<Custom Action="SilentMRT" After="InstallFinalize" />
</InstallExecuteSequence>
<Binary Id="SilentInstall" SourceFile="E000874\launchquiet.vbs" />
<CustomAction BinaryKey="SilentInstall" VBScriptCall="runQuiet" Id="SilentMRT" Return="check" />
安装程序正确运行但mrt.exe根本不运行。当我删除,0
和oShell=Nothing
行时,会显示一个cmd提示符,但它不会调用.exe,它只会弹出提示符。
如果我使用wScript从cmd运行VBS,它会按预期静默运行exe。
关于我需要在vbs中改变什么的想法?
日志文件说什么?不要从其他MSI文件中的自定义操作启动MSI安装。技术上不允许两个并发的MSI会话。相反,使用引导程序(如WiX's Burn feature)一个接一个地运行设置。实施起来并不难,你会省去很多麻烦。 Burn documentation。说真的:它应该解决你所有的问题,并且不需要自定义操作或VBScripts。
在InstallFinalize之后启动另一个具有立即模式自定义操作的MSI(就像您似乎那样)也将失败,因为自定义操作不会以提升的权限运行(当以静默方式启动时)。因此,即使之前的MSI会话已在InstallFinalize结束,由于其他技术限制,它仍然会失败,而不是上面提到的那个(不允许两个并发会话对象)。
对于记录:MSI会话(更改事务)在InstallInitialize和InstallFinalize之间运行 - 只是提到它 - 这是一个很长的故事。必须在InstallInitialize和InstallFinalize之间放置提升的自定义操作。
修改系统的InstallFinalize之后的所有立即模式自定义操作都是错误的。坦率地说,在InstallFinalize之后根本就没有自定义操作。它们总是在没有高程的情况下运行,并且它们始终没有回滚支持。此处的延迟自定义操作将无法编译。
并且请不要尝试将自定义操作放在UI序列中 - 这将导致它在静默安装安装程序时永远不会运行。