QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

【バッチファイル】tasklistの実行結果取得方法について

tasklistを使用して特定のユーザがあるプロセスを起動しているかどうか
判断し、IF文で起動している場合としていない場合の処理を
行いたいと思っています。

ただし、tasklistの実行結果はerrorleveでは取れません。
(プロセスが存在してもしなくても常に0となっている)

tasklistの結果でIF文判定させるよい方法がありましたら、ご教授頂けないでしょうか。
コマンド例
tasklist /FI "USERNAME eq test01" /FI "IMAGENAME eq excel.exe"

質問者:ベジータ

回答

効率がいまいちですが find をいれたらどうでしょう

tasklist /FI "USERNAME eq test01" /FI "IMAGENAME eq excel.exe" | find "IMAGENAME"

投稿者:はむ

編集 履歴 (0)

@echo off
for /F "usebackq tokens=1" %%i in (tasklist /FI "USERNAME eq test01" /FI "IMAGENAME eq excel.exe" 2^>^&1) do @set RESULT=%%i
echo %RESULT%

とか。

投稿者:デューン

編集 履歴 (0)

ご回答頂きありがとうございます。

取り急ぎデューンさんのコマンドを試してみましたが、
戻り値は,プロセスがあってもなくても"tasklist"となってしまっており
判定出来ない状況となっております。

投稿者:ベジータ

編集 履歴 (0)

戻り値は,プロセスがあってもなくても"tasklist"となってしまっており

IMAGENAMEは指定していますか?

IMAGENAMEを指定していなければそうなるかもしれません。

ぜんぶ列挙してそこから抽出したいのであれば
はむさんがおっしゃっているfindや、
もう少し凝った処理にしたいのであればfindstrなどを使って

@echo off
for /F "usebackq tokens=1" %%i in (tasklist /FI "USERNAME eq test01" 2^>^&1 ^| findstr /C:"excel" /C:"word" /I) do @set RESULT=%%i
echo %RESULT%

などとしてください

投稿者:デューン

編集 履歴 (0)

IMAGENAMEは指定していますか?
IMAGENAMEを指定して検証しましたが、やはり"tasklist"がechoで
返されます。

@echo off
for /F "usebackq tokens=1" %%i in (tasklist /FI "USERNAME eq test01" 2^>^&1 ^| findstr /C:"excel" /C:"word" /I) do @set RESULT=%%i
echo %RESULT%

上記の通り動かしたのですが、プロセスが存在する場合もしない場合も
共通で"tasklist"が返されます。

度々申し訳ございませんが、再度ご教授頂けないでしょうか。

投稿者:ベジータ

編集 履歴 (0)

なんだか自分の未熟さゆえ大がかりになってしまいました。

バッチファイルにして実行してみてください。
うまくいかない場合は
REM echo %RESULT%
のコメントをはずしてみてください



@echo off
@set TASKLISTUSER=test01
@set RESULT=

REM TASKLIST実行
for /F "usebackq tokens=1" %%i in (`tasklist /FI "USERNAME eq %TASKLISTUSER%" `) do @call :result_append %%i
REM for /F "usebackq tokens=1" %%i in (`tasklist /FI "USERNAME eq %TASKLISTUSER%" 2^>^&1 `) do @call :result_append %%i

REM find実行
REM echo %RESULT%
if "%RESULT%" NEQ "" goto :find 

REM RESULTから検索
goto:EOF

REM RESULTから検索
:find
for %%i in ( %RESULT% ) do ( echo "%%i" ^^| findstr /I /C:"excel" /C:"word" ) 
:exit

REM RESULTに追加
:result_append
@set RESULT=%RESULT%;%*
:exit

# デバッグ用のコメントが間違えてたので修正
[ メッセージ編集済み 編集者: デューン 編集日時 2009-03-11 13:38 ]

投稿者:デューン

編集 履歴 (0)

デューンさん>ありがとうございます。動作致しました。
はむ>下記のコマンドで起動成功失敗のerrorlevelが取れました。

tasklist /FI "USERNAME eq ユーザ名" | findstr プロセス名
echo %errorlevel%

起動時間などを比較し、どちらで行なうか検討したいと思います。
お二人とも、アドバイス頂き、誠にありがとうございました。

投稿者:ベジータ

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。