[解決済み] Powershell プロセスの開始、タイムアウトによる待機、Kill、終了コードの取得
2022-03-11 13:30:02
質問
あるプログラムをループで繰り返し実行したい。
時々、プログラムがクラッシュするので、次の繰り返しが正しく開始できるように、プログラムを終了させたいと思います。私はこれをタイムアウトによって決定する。
タイムアウトは機能していますが、プログラムのExit Codeを取得することができません。
以前は、タイムアウトで待たずに、Start-Processで-waitを使うだけでしたが、これだと起動したプログラムがクラッシュするとスクリプトがハングしてしまいます。しかし、この設定では、終了コードを正しく取得することができました。
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
}
}
どうすれば
- プロセスの開始
- 順番に実行され、終了するのを待つ
- クラッシュした場合(例:タイムアウトになった場合)、Killする。
- プロセスの終了コードを取得する
解決方法は?
を使用すると、より簡単にプロセスを終了させることができます。
$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 -ErrorAction SilentlyContinue -ErrorVariable timeouted
if ($timeouted)
{
# terminate the process
$proc | kill
# update internal error counter
}
elseif ($proc.ExitCode -ne 0)
{
# update internal error counter
}
}
関連
-
[解決済み】'<'演算子は将来の使用のために予約されている
-
[解決済み】powershellで再利用するために資格情報を保存すると、ConvertTo-SecureString : Key not valid for use in specified stateというエラーが発生する。
-
[解決済み] PowerShellで、変数が数値を保持しているかどうかをテストするにはどうすればよいですか?
-
[解決済み] PowerShellでファイルを一行ずつ読み込む
-
[解決済み] powershellスクリプトで、最後に改行を入れずにWrite-Warningすることはできますか?
-
[解決済み] いずれかのキーを押して続行[複製]。
-
[解決済み] PowerShellを使用してSFTPにファイルをアップロードする
-
[解決済み] Windowsのコマンドラインからアプリケーションの終了コードを取得するにはどうすればよいですか?
-
[解決済み] bash で複数のサブプロセスが終了するのを待ち、いずれかのサブプロセスがコード !=0 で終了したときに終了コード !=0 を返すにはどうすればよいですか?
-
[解決済み] Start-Processで標準出力と誤差を捕捉する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] NULL 値の式でメソッドを呼び出すことはできない
-
[解決済み] powershellでパラメータ'Path'がNULLのため引数を結合できないエラーの取得
-
[解決済み] Send-MailMessage - リモートサーバーに接続できません。
-
[解決済み] Add-ADGroupMember が ID を持つオブジェクトを見つけられません。
-
[解決済み] Resolve-Pathコマンドレットは、具体的にどのような処理を行うのですか?
-
[解決済み] Get-ADUser -Identity
-
[解決済み] powershellでマウスクリックを送信するにはどうすればよいですか?
-
[解決済み] グローバル変数名が関数に渡された変数である関数からPowerShellのグローバル変数を設定する
-
[解決済み] コピーアイテムはデフォルトで上書きをする
-
[解決済み] powershellの&マークはどういう意味ですか?