6

バッチ ファイル内のラベルで次のコマンドを実行しています。

tasklist.exe /FI "USERNAME eq %USERDOMAIN%\%USERNAME%" /FI "IMAGENAME eq %1" /FI "PID eq %2" 2>nul && echo errorl:%errorlevel%

%1 は実行中のプロセスで、%2 はその PID です。プロセスとその PID が一致しても一致しなくても、o/p で "errorl:1" が返されます。

ここで何が悪いのかわかりません。何か案が?

4

5 に答える 5

9

findコマンドを介してタスクリストをパイプ処理し、エラーレベルを取得することができます。

例:

tasklist | find "firefox.exe"
echo Error level = %ERRORLEVEL%

REM If firefox is running, the errorlevel is set to 0
REM If firefox is not running, errorlevel is set to 1
于 2012-03-06T21:27:26.990 に答える
7

私の意見では、pid が見つからなくてもtasklist
は常に 0 を返す ため、errorlevel はまったく使用できません。

tasklist の出力を解析する必要があると思います。
コマンドの出力をフェッチするのFOR /Fは良い選択です。

での引用符の問題を回避するために、特殊文字の副作用を避けるために遅延展開で展開さFOR /Fれる変数を最初に作成します。cmd

@echo off
setlocal enableDelayedExpansion

set "cmd=tasklist.exe /FI "USERNAME eq %USERDOMAIN%\%USERNAME%" /FI "IMAGENAME eq %1" /FI "PID eq %2""

for /F "delims=*" %%p in ('!cmd! ^| findstr "%2" ') do (
  echo found %%p
)
于 2011-02-11T13:48:14.627 に答える
2

%variables% は行を実行する前に展開されるため、%errorlevel% は古い値に展開されます。( && の後のコードがまったく実行されるという事実は、コマンドが 0 を返したことの手がかりです)

オプションは次のとおりです。

  • 次の行で%errorlevel%orを使用してくださいIF errorlevel 1 ...
  • 電話setlocal ENABLEDELAYEDEXPANSIONしてから使う!errorlevel!

編集: タスクリストは、終了コードに関してはバグがあるか愚かだと思います。終了コードをまったく使用しないコードをいくつか書きました:

@echo off
if "%~1"=="SOTEST" (
    start calc
    ping -n 2 localhost >nul
    for /F "tokens=1,2 skip=3" %%A in ('tasklist /FI "IMAGENAME eq calc.exe"') do (
        call "%~0" %%A %%B
    )
    call "%~0" dummy.exe 666
    goto :EOF
)
goto main


:IsTaskRunning
setlocal ENABLEEXTENSIONS&set _r=0
>nul 2>&1 (for /F "tokens=1,2" %%A in ('tasklist /FO LIST %*') do (
    if /I "%%~A"=="PID:" set _r=1
))
endlocal&set IsTaskRunning=%_r%&goto :EOF

:main
call :IsTaskRunning /FI "USERNAME eq %USERDOMAIN%\%USERNAME%" /FI "IMAGENAME eq %1" /FI "PID eq %2"
if %IsTaskRunning% gtr 0 (echo.%1:%2 is running) else (echo.%1:%2 is NOT running)

test.cmd SOTEST として実行すると、次のように出力されます。

calc.exe:4852 is running
dummy.exe:666 is NOT running
于 2011-02-11T13:41:22.440 に答える
1

これを考えると、これに対する簡単な解決策

 1) you can't get an errorlevel from tasklist, and
 2) you can't directly pipe it to a FIND

出力リダイレクトを使用してファイルに書き込み、FIND を使用してファイルを確認するだけです。これが実行されるたびに、前の反復が上書きされるため、ファイルのクリーンアップを行う必要さえありません。単純なスクラッチパッド ファイルで、bat/cmd ファイルの制限をいくつも克服できるのは驚くべきことです!!

:TOP
rem swap rems from good to bad to test
set findvar=goodfile.exe          
rem set findvar=badfile.exe
set scratchfile=scratch.txt
tasklist /fi "status eq running" /fi "imagename eq %findvar%">%scratchfile%
type %scratchfile%
pause
echo Looking for %findvar%
find "%findvar%" %scratchfile%
echo Error level = %errorlevel%
pause
IF errorlevel 1 GOTO BAD
IF errorlevel 0 GOTO GOOD
GOTO OTHER

:BAD
 echo Errrlevel 1 - task not found
 PAUSE     
 GOTO TOP
:GOOD
 echo Errrlevel 0 - task is running
 pause
 GOTO TOP
:OTHER
 echo something else ????? you blew it somewhere!
于 2016-08-22T07:59:59.333 に答える