6

プロセスを停止 (強制終了) するスクリプトがあります。その直後に、プロセスが実際に停止しているかどうかを確認するコードが必要です。そうでない場合は、スクリプトを終了します (実際に停止している場合、スクリプトはもちろん続行します)。

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ですか、それとも論理的な欠陥ですか? (もしそうなら、修正は何ですか?)

4

2 に答える 2

0

問題は、その後すぐにチェックしすぎていることだと思います。ifステートメントは、プロセスが停止する前に実行されます。Stop-Processを使用すると、コマンドに停止信号が送信され、プロセスが実際に停止するのを待ちません。と の間にSleep 1、またはを追加してみてください。終了したかどうかを確認する前に、終了するまで少し待ってください。Sleep .1Stop-Process [...]if (Get-Process [...]

于 2013-07-25T19:31:16.877 に答える