我使用powershell脚本实现了自动检索和安装指定的.msi包,但是如果命令被调用时出现语法错误,msiexec将无限期地等待其帮助显示中的确定单击,尽pipe存在/ quiet和/或/ passive 。
目前我正在调用它:
(start-process -FilePath "msiexec" -ArgumentList "/i <path_to_package> /quiet /passive" -PassThru -Wait).ExitCode
有没有办法禁用msiexec帮助显示?
可悲的是,我认为避免帮助显示的唯一方法是…
…没有任何错别字/语法错误。
我希望我能给你一个更好的答案,但是…
无法为包含语法错误的msiexec
命令禁用此行为。 你可以把这个命令包装成下面这样的东西。 它使用.NET自动化来查找“用法”窗口并在脚本中处理它。
Add-Type -AssemblyName UIAutomationClient Add-Type -AssemblyName UIAutomationTypes # Note the invalid argument '/badswitch' $mse = Start-Process -FilePath 'msiexec' -ArgumentList "/i package.msi /badswitch /quiet /passive" -PassThru # Let msiexec at least get off the ground [void] $mse.WaitForInputIdle() # Create an AutomationElement from $mse's handle $mseAuto = [Windows.Automation.AutomationElement]::FromHandle($mse.MainWindowHandle) # A PropertyCondition for findAll() $pane = New-Object Windows.Automation.PropertyCondition -ArgumentList ( [Windows.Automation.AutomationElement]::ControlTypeProperty, [Windows.Automation.ControlType]::Pane ) # Search for a child $pane element. $findResult = $mseAuto.FindFirst( [System.Windows.Automation.TreeScope]::Children, $pane ) # If there's a pane element in $mseAuto, and it contains "usage" string, it's an msiexec syntax issue, so close $mse's window. if ( $findResult.Current.Name -match 'msiexec /Option <Required Parameter>' ) { [void] $mse.CloseMainWindow() } else { # You should put something more sane here to handle waiting for "good" installs to complete. $mse.WaitForExit() } $mse.ExitCode
这也有问题。 使用/quiet
时,安装期间仍会显示进度对话框。 你可能会考虑使用/qn
来代替隐藏所有的msiexec
UI元素。 以及MSI可能会触发其他错误,未处理,这将暂停执行不忠。 也许包括超时价值? 那么从CustomAction表中启动的外部进程是什么? 对不起,我现在正在散漫
我只是避免完全通过msiexec.exe。 这可以通过使用脚本或代码通过Windows安装程序API进行。
您可以使用VBScript / VBA / VB通过COM自动化,或者使用Windows Installer API的.NET包装器DTF,这更容易从.NET语言(如C#)中使用。
你甚至可以直接通过C ++到原始的Win32 API调用,但是这只是浪费时间,因为你有COM和.NET等价物,它们把原始的Win32 API作为其操作的一部分。
如果使用自动化是一个选项,您应该能够通过Windows Installer COM自动化并自动安装/卸载。 这里是一个VBScript你可以放在一个文件中并运行(显然更新MSIpath名):
Const msiUILevelEndDialog = 128 Set msi = CreateObject("WindowsInstaller.Installer") msi.UILevel = msiUILevelEndDialog msi.InstallProduct( "C:\msifile.msi") Set msi = Nothing
DTF (部署工具基础)本质上是Windows Installer API的.NET包装 – 它具有如此强大的.NET程序集合,可直接与Windows Installer的各个方面一起工作,我只是想将其添加到这里供参考,search具有大量细粒度部署控制的解决scheme来解决其pipe理问题。 C#应用程序中的非常简单的代码提供了对安装过程的完全控制。 这是一个粗略的模拟:
using Microsoft.Deployment.WindowsInstaller.Installer; Installer.SetInternalUI(InstallUIOptions.Silent); Installer.InstallProduct(msiFilename, "ACTION=INSTALL ALLUSERS=1");
您可以通过WIX工具包获得DTF,这是从XML源文件创buildMSI文件的整体解决scheme。 您将在DTF.chm和DTFAPI.chm中find优秀的文档,实际文件位于主安装文件夹中。 最后两个通常是你需要的:
只需创build一个C#项目,引用这些文件,并用您所需的任何控件编写您自己的部署应用程序。 目前我还没有为DTF设置工具,但是看到这个示例是关于C#程序如何工作的一般概念。
你有没有尝试过/ qn开关? 它应该禁止所有的用户界面提示。
http://technet.microsoft.com/en-us/library/cc759262(v=ws.10).aspx#BKMK_SetUI