Powershellからfirefox.exeを停止させるには、次のようにすればいい:
#firefoxのプロセスを取得する
$p = ps firefox
#プロセスのメインウィンドウを閉じる
$p.CloseMainWindow()
//
しかし、メインウィンドウを閉じても終了しないプロセスもあるし、メインウィンドウのないプロセスもある。それに、文字列でも取得済みのプロセスでも扱えるようにしないと、使い勝手が悪いし、複数の同名プロセスを一度に終了させたい。
そこで、ひと工夫:
function global:close($o){
#エラーを表示しない
$global:ErrorActionPreference = 'SilentlyContinue'
#与えられた引数が文字列ならば、引数からプロセスを取得する
if($o.GetType().Name -eq "String"){
$o = ps $o
trap{'';continue}
}
#もしもプロセスが存在するのであれば
if(!!$o){
#同名複数のプロセスのそれぞれについて
foreach($i in $o){
#メインウィンドウが存在しなければ、強制終了させ、次の処理に移る
if($i.MainWindowHandle -eq 0){
$i.Kill()
continue
}
#メインウィンドウを閉じる
$i.CloseMainWindow()
#プロセスの終了まで最長10秒間待つ
for($c = 1; $c -le 10; $c++){
if(!($i.HasExited)){
Sleep 1
}
else{
break
}
}
#もしもプロセスが終了していなければ、ここで強制終了させる
if(!($i.HasExited)){
$i.Kill()
}
}
}
#エラー表示設定を元に戻す
$global:ErrorActionPreference = 'Continue'
}
//
一応いっておくと、ワイルドカードを使うと危険かもしれない。例えば、"close *"なんて使い方をすると、すべてのプロセスを閉じるか強制終了しようとするので、何が起こるか分からない。
コメントの投稿