pgrep.cmd / pkill.cmd2008年09月29日 12時51分41秒

なんちゃってコマンド・番外編

ほんとはもうこの関連やらないつもりだっだんだけど、「FORコマンドで遊んでみる。」のコメント欄で、たけチンさんからリクエストをいただいたのでちょろっとやってみました。やっぱ同一名称のプロセス全殺しの需要があったか。

内容からして、基本は「FORコマンドで遊んでみる。」の「killでメモ帳を全て終了」で例示したコマンドをほぼそのまま使えるのでスクリプト作成なし、バッチファイルのみでやってます。

ただ、リクエストいただいたpgrep、pkillとも普段使ってないコマンドであまり詳しくないので、

最低限はプロセス名称でのgrepができればいいのですが、、、
という最低限の実装しかしてません。ご容赦くださいな。 > たけチンさん

pgrep.cmd

まずはプロセスIDを列挙するpgrepから。基本はforコマンドにps+findstrの出力を渡してechoするだけなんだけども、

バッチ プログラムで FOR コマンドを使用するときは、%変数の代わりに、%%変数を使用してください。
for /? より抜粋
ってな注意書きがあるので、そのあたりに気をつけてこんな感じ。
@echo off
for /f "tokens=1" %%p in ( '"ps -a| findstr -i %1"' ) do @echo %%p

この内容を「pgrep.cmd」とか「pgrep.bat」とかでパスが通ったところに保存すればOKです。まぁ、前提としてps.js、ps.cmd、kill.cmdがパスの通ったところに設置済みである必要がありますが。

いちおう以前配布したzipに含めたので、ps.jsとかを設置していない場合はこちらをダウンロードして、こちらのエントリを参考にして設置してみてくださいな。

技術的もは、findstr(というかクォートされたコマンド)にそのまま%1でバッチの引数渡せるか心配だったんだけど、やってみたらすんなり通ったのでこれで完成。

あ、findstrは無条件に -i オプション(ignore case)をつけちゃってます。だってwindowsだし。

pkill.cmd

もうね、さっきのバッチの「@echo」を「@kill」に変えるだけなんですよ。えぇ。

@echo off
for /f "tokens=1" %%p in ( '"ps -a| findstr -i %1"' ) do @kill %%p

設置の仕方はpgrep.cmdと同じです。当然zipに含めてあります。

試してみる

まず、メモ帳2つと、NOTEPAD++を起動した状態で、ps+findstrで確認。

C:\Documents and Settings\dara-j>ps -a | findstr -i notepad
 9564   164 dara-j               4940     4940    0:00:00 notepad.exe
 6456   164 dara-j               5048     5048    0:00:00 notepad.exe
 8360   888 dara-j                828    17328    0:00:00 notepad++.exe

C:\Documents and Settings\dara-j>
んでpgrepしてみる。
C:\Documents and Settings\dara-j>pgrep notepad
9564
6456
8360

C:\Documents and Settings\dara-j>
うん、3つ表示されますな。

じゃ、今度はメモ帳だけに限定。

C:\Documents and Settings\dara-j>pgrep "notepad.exe"
9564
6456

C:\Documents and Settings\dara-j>
うん、ちゃんとnotepad++(PID:8360)が除外されてますな。あ、パターンをクォートするときはダブルクォートにしてください。シングルクォートだとキチンとパターン(バッチ中の「%1」)に渡せないので。

最後にpkillの確認。メモ帳だけ全殺し。

C:\Documents and Settings\dara-j>pkill "notepad.exe"

C:\Documents and Settings\dara-j>pgrep "notepad.exe"

C:\Documents and Settings\dara-j>pgrep notepad
8360

C:\Documents and Settings\dara-j>
はい、notepad++だけは生き残ってます。当然画面上でもメモ帳のウィンドウがばっさり切られたと思います。ちなみに「pkill notepad」にするとnotepad++も殺されます。

関連記事

コメント

_ たけチン ― 2008年09月30日 23時26分06秒

 ありがとうございます! ちょうど、プロセス制御のできるWSH(JS)を探していました。
できれば、システムのデフォルトブラウザを探してそのプロセスを全て落としたい
ところですが、IEが終了できれば9割以上はOKです。
 ちなみに WScript.CreateObject("Shell.Application") を利用して選択的にIEを落とすJSはみつかっていまして、強制で落とすものがほしかったのです。

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2008/09/29/3788378/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。