簡體   English   中英

PowerShell等待應用程序啟動

[英]PowerShell wait application to launch

我有以下腳本來啟動應用程序:

add-type -AssemblyName microsoft.VisualBasic
add-type -AssemblyName System.Windows.Forms
$args = "arguments"
$proc = Start-Process -PassThru "path" -ArgumentList $args
start-sleep -Seconds 5
[Microsoft.VisualBasic.Interaction]::AppActivate($proc.Id)
[System.Windows.Forms.SendKeys]::SendWait("~")

我使用這個腳本啟動幾個需要用戶交互啟動的Windows窗體應用程序(即按下啟動按鈕)。 到目前為止,我一直在睡眠腳本5秒鍾,以允許應用程序啟動。 我嘗試在具有不同處理能力的各種計算機上運行此腳本,但在所有計算機上都不起作用,有些啟動應用程序的速度比其他計算機慢,當應用程序花了5秒多時間啟動應用程序腳本失敗時,因為AppActivate無法找到PID。 我不想為每台計算機嘗試不同的休眠時間,因為我必須在啟動時在100多台計算機上運行此腳本。

我想知道是否有辦法等待應用程序以事件驅動的方式啟動。

更新:

WaitForInputIdle在我嘗試啟動的所有應用程序中都不起作用。 它立即返回(成功,因為它返回true),AppActive方法拋出異常。

我建議你不要使用“Sleep”來同步系統對象(這絕不是一個好的解決方案)。 至於您啟動Windows窗體應用程序,我建議您使用Process.WaitForInputIdle方法。

 $p = [diagnostics.process]::start("notepad.exe", "D:\temp\1mbfile.txt")
 $p.WaitForInputIdle(5000);

在循環中使用它可以測試或者測試輸入是否空閑(應用程序已啟動並等待)或應用程序是否已停止( $p.HasExited -eq $true )。

do
 {
   if ($p.HasExited -eq $true)
   {
     break
   }
 } while ($p.WaitForInputIdle(5000) -ne $true)

所以,我終於編寫了這個解決方法,因為WaitForInputIdle不適用於我的所有應用程序,我無法弄清楚原因。

do{
    if ($proc.MainWindowHandle -ne 0)
   {
        break
   }
   $proc.Refresh() 
} while ($true)

我不確定這是否是最佳方法; 無論如何,我想分享這個。

這兩個答案都沒有等到我的腳本足夠長的時間,所以我想出了這個,等待進程停止使用cpu。

do{
$ProcCpu = $Process.CPU
Start-Sleep -Milliseconds 100
} until($ProcCpu -eq $Process.CPU)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM