PowerShell等待应用程序启动

时间:2016-02-01 03:00:54

标签: powershell

我有以下脚本来启动应用程序:

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方法抛出异常。

3 个答案:

答案 0 :(得分:3)

我建议你避免使用"睡眠"同步系统对象(它永远不是一个好的解决方案)。至于您启动Windows窗体应用程序,我建议您使用Process.WaitForInputIdle方法。

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

在循环中使用它可以测试输入是否空闲(应用程序已启动并等待)或应用程序是否已停止(if ( ( static_cast<unsigned int>(1) == x ) && y) )。

public interface resultInterface {

    void Success(JSONObject response);

    void Error(VolleyError error);
}

答案 1 :(得分:1)

所以,我终于编写了这个解决方法,因为WaitForInputIdle不适用于我的所有应用程序,我无法弄清楚原因。

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

我不确定这是否是最佳方法;无论如何,我想分享这个。

答案 2 :(得分:1)

其他答案都没有等到我的脚本等待足够长的时间,所以我想到了这个答案,直到过程停止使用cpu为止。

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