プロセスを停止 (強制終了) するスクリプトがあります。その直後に、プロセスが実際に停止しているかどうかを確認するコードが必要です。そうでない場合は、スクリプトを終了します (実際に停止している場合、スクリプトはもちろん続行します)。
if (Get-Process "notepad" -ErrorAction SilentlyContinue) {
Write-Host "Program still running somehow, terminating script..."
exit
}
else
{ Write-Host "Program stopped." }
(Get-Process "progname" -ErrorAction SilentlyContinue)
実行中のプロセスが 1 つ以上ある場合 (つまり、出力が返された場合)、ステートメントは $true に評価され、出力が返されなかった場合は $false になることがわかったと思います (出力が-ErrorAction SilentlyContinue
ないことを確認するために を指定しました)。その名前で見つかったプログラムがなかった場合に出力が返されます。) 実行中のプログラム (「メモ帳」など) を使用してこのコード ブロックを実行したときのテストや、存在しないプログラム (「notepadxxx」など) を試したときにも機能しました。 ".)
ただし、それをより大きなプログラムに統合し、プログラムを終了する行の直後に配置すると、次のようになります。
Write-Host "Terminating Program..."
Stop-Process -Name "notepad" -Force
if (Get-Process "notepad" -ErrorAction SilentlyContinue) {
Write-Host "Program still running somehow, terminating script..."
exit
}
else
{ Write-Host "Program stopped." }
行はGet-Process
$true に評価され、スクリプトを終了します。Stop-Process
これは、行と後続の行の間の単なる競合状態Get-Process
ですか、それとも論理的な欠陥ですか? (もしそうなら、修正は何ですか?)