- PR -

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

1
投稿者投稿内容
ベジータ
会議室デビュー日: 2007/10/29
投稿数: 14
投稿日時: 2009-03-10 01:12
tasklistを使用して特定のユーザがあるプロセスを起動しているかどうか
判断し、IF文で起動している場合としていない場合の処理を
行いたいと思っています。

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

tasklistの結果でIF文判定させるよい方法がありましたら、ご教授頂けないでしょうか。
コマンド例
tasklist /FI "USERNAME eq test01" /FI "IMAGENAME eq excel.exe"
はむ
会議室デビュー日: 2006/12/15
投稿数: 8
投稿日時: 2009-03-10 07:50
効率がいまいちですが find をいれたらどうでしょう

tasklist /FI "USERNAME eq test01" /FI "IMAGENAME eq excel.exe" | find "IMAGENAME"
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-03-10 10:10

@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%

とか。
ベジータ
会議室デビュー日: 2007/10/29
投稿数: 14
投稿日時: 2009-03-10 10:46
ご回答頂きありがとうございます。

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

デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-03-10 11:14
引用:

戻り値は,プロセスがあってもなくても"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%

などとしてください
ベジータ
会議室デビュー日: 2007/10/29
投稿数: 14
投稿日時: 2009-03-10 20:45
>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"が返されます。

度々申し訳ございませんが、再度ご教授頂けないでしょうか。
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-03-11 13:34
なんだか自分の未熟さゆえ大がかりになってしまいました。

バッチファイルにして実行してみてください。
うまくいかない場合は
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 ]
ベジータ
会議室デビュー日: 2007/10/29
投稿数: 14
投稿日時: 2009-03-11 14:38
デューンさん>ありがとうございます。動作致しました。
はむ>下記のコマンドで起動成功失敗のerrorlevelが取れました。

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

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

スキルアップ/キャリアアップ(JOB@IT)