PowerShell で バックグラウンドプロセスを kill する方法
Windowsでバックグラウンド実行したプロセスを殺したい場合、どうすればよいでしょうか?
PowerShell を使えばプロセスIDを探してKillすることができます。
まず、以下のようなバックグラウンドで無限ループをするプログラムを作って実行します。
バックグラウンドで動くので生きてるかわかりにくいのでテキストファイルに日時を書き続けます。
hoge.ps1
while ($true) {
Write-Output "$((Get-Date).toString('yyyy-MM-dd HH:mm:ss.fff'))" >> "hoge.log"
timeout /t 1 /nobreak
}
バックグラウンドで hoge.ps1 を実行。
Powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted ./hoge.ps1
"-ExecutionPolicy Unrestricted" はつけないとWindowsの設定によっては、
. : File C:\Users\{ユーザ名}\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at
https:/go.microsoft.com/fwlink/?LinkID=135170.
みたいなエラーが出ます。要は実行権限の話ですね。
hoge.logファイルを定期的に開いて中を確認すると値が書き込まれ続けているので、ちゃんとバックグラウンドで動いている感じです。
ではこれを殺すにはどうしたらよいのでしょうか?
このプログラムのプロセスIDに対してKillコマンドを送ることでプロセスを終了させることができます。
まずはこのプログラムのプロセスIDを取得しましょう。
タスクの一覧を以下のコマンドで取得し、その中から本プログラム(hoge.ps1)のプロセスIDを取得します。
PS > WMIC path win32_process get Caption,Processid,Commandline /format:csv | sls "hoge.ps1"
MSI-OFFICE,powershell.exe,"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -WindowStyle Hidden -ExecutionPolicy Unrestricted ./hoge.ps1,40148
そして、Taskkill コマンドでプロセスを Kill します。
プロセスIDは行の一番最後の数字、ここでいうと40148ですね。
PS > Taskkill /PID 40148 /f
成功: PID 40148 のプロセスは強制終了されました。
これでプロセスが消えたはずです。
2回に分けずに一気にkillまでしたいのであれば、
PS > WMIC path win32_process get Caption,Processid,Commandline /format:csv | sls "hoge.ps1" | % {Taskkill /PID $_.Line.Split(",")[3] /f }
成功: PID 40148 のプロセスは強制終了されました。
とすれば消えますが、ちょっと怖いので最初は確認しながらのほうが良いです。(同じ名前で引っかかるプロセスもあるでしょうから)
以上です。