Windows
是否可以禁用 msiexec 幫助 GUI?
我正在使用 powershell 腳本自動執行無人值守的檢索和安裝指定的 .msi 包,但是如果呼叫該命令時出現語法錯誤,儘管存在 /quiet 和/或 /passive,但 msiexec 將無限期地等待其幫助顯示上的 OK 點擊.
目前我正在呼叫它:
(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 表啟動的外部程序又是什麼?抱歉,我現在差點亂跑了……