Windows

是否可以禁用 msiexec 幫助 GUI?

  • October 10, 2020

我正在使用 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改用會隱藏所有msiexecUI 元素。MSI 也可能觸發其他未處理的錯誤,這將暫停執行不忠。也許包括一個超時值?從 CustomAction 表啟動的外部程序又是什麼?抱歉,我現在差點亂跑了……

引用自:https://serverfault.com/questions/577969