2016-04-29 100 views
2

ループ内でプログラムを繰り返し実行したいですか?Powershellプロセスの開始、タイムアウトの待機、終了コードの取得

プログラムがクラッシュすることがあるので、次の繰り返しが正しく開始できるように、プログラムを強制終了します。私はタイムアウトを介してこれを判断します。

タイムアウトはありますが、プログラムの終了コードを取得できません。プログラムの終了コードも取得できません。その結果を判断する必要があります。

私はタイムアウトを待つことなく、Start-Processで使用しましたが、起動したプログラムがクラッシュした場合にスクリプトがハングしました。この設定では、私は正しく終了コードを得ることができます。

私はISEから実行しています。

for ($i=0; $i -le $max_iterations; $i++) 
{ 
    $proc = Start-Process -filePath $programtorun -ArgumentList $argumentlist -workingdirectory $programtorunpath -PassThru 
    # wait up to x seconds for normal termination 
    Wait-Process -Timeout 300 -Name $programname 
    # if not exited, kill process 
    if(!$proc.hasExited) { 
     echo "kill the process" 
     #$proc.Kill() <- not working if proc is crashed 
     Start-Process -filePath "taskkill.exe" -Wait -ArgumentList '/F', '/IM', $fullprogramname 
    } 
    # this is where I want to use exit code but it comes in empty 
    if ($proc.ExitCode -ne 0) { 
     # update internal error counters based on result 
    } 
} 

はどうすればよい

  1. スタートそのためのプロセス
  2. 待ち秩序へ
  3. を実行し、終了し、それがクラッシュした場合
  4. が終了コードを取得する(例えば、タイムアウトに当たる)それを殺しますプロセス
+0

[待ってPowerShellでタイムアウト処理を殺す方法](HTTPS:あなたは、あなたではなく、単に内部エラーカウンタを更新する必要があり、この場合の終了コードを取得することができなくなりますので、注意してください: //stackoverflow.com/q/19532998/995714) –

答えて

5

プロセスを終了することができます($proc | killまたは$proc.Kill()を使用)。

for ($i=0; $i -le $max_iterations; $i++) 
{ 
    $proc = Start-Process -filePath $programtorun -ArgumentList $argumentlist -workingdirectory $programtorunpath -PassThru 

    # keep track of timeout event 
    $timeouted = $null # reset any previously set timeout 

    # wait up to x seconds for normal termination 
    $proc | Wait-Process -Timeout 4 -ea 0 -ev timeouted 

    if ($timeouted) 
    { 
     # terminate the process 
     $proc | kill 

     # update internal error counter 
    } 
    elseif ($proc.ExitCode -ne 0) 
    { 
     # update internal error counter 
    } 
} 
+0

ありがとうございました! Wait-Processはソリューション内で400秒間正しく待機しますが、 "#terminate the process"句はタイムアウト後も決してヒットしません。したがって、プロセスは強制終了されず、次の反復処理後に2つのプロセスが実行されます。 (私はこのケースを強制的に小さなタイムアウトでテストしました) –

+1

あなたは正しいです、私はWait-Processが何かを返すと思っていました。私は自分の答えを編集しました。エラーメッセージを$ timeoutedに代入しました。タイムアウトが発生した場合は、設定されています。 –

+0

ありがとう! (マイナーなタイプミスがありました)素晴らしい作業! –

関連する問題