search this site:

Chaotic Neutral

左にも右にもよらず、自由な生き方探し。

Windows Powershell ― $p.CloseMainWindow()


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 *"なんて使い方をすると、すべてのプロセスを閉じるか強制終了しようとするので、何が起こるか分からない。

  • 2008年07月01日火
  • URL
  • Lexar #tV7uNBRQ
  • 編集

コメントの投稿

URL
コメント
パスワード
秘密
管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://reviva.blog1.fc2.com/tb.php/1025-a67f87c1