2011-02-11 45 views
4

我在批处理文件中的标签中执行以下命令: 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”。

我不知道这里有什么错。任何想法?

回答

6

在我看来,你不能使用ERRORLEVEL可言,
因为任务列表总是返回即使PID找不到0。

我想,你必须解析任务列表的输出。

@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 
) 
1

变量%在执行该行之前展开,因此%errorlevel%将展开为某个旧值。 (即之后的代码& &执行所有的事实是你的线索,命令返回0)

您的选项有:

  • 使用%errorlevel%或下一行
  • 通话更正确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 
+0

但是:IF ERRORLEVEL 1是真实的,如果错误级别为1或1大,这可能是意外的行为,我更喜欢IF%ERRORLEVEL%EQU 1或IF%ERRORLEVEL%GTR 1 – jeb 2011-02-11 14:00:58

+0

安德斯嗨,我已经在我的批处理脚本中使用了setlocal ENABLEDELAYEDEXPANSION,并按照您所描述的方式访问参数。但它没有工作。 – user613114 2011-02-11 14:03:31

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 
0

解决这个,因为

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

只是它使用输出重定向写入到一个文件,并使用find来检查文件。每次运行时,它都会覆盖之前的迭代,因此不需要执行任何文件清理。惊人的简单的便签簿文件可以克服多少蝙蝠/ 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!