我在批处理文件中的标签中执行以下命令: 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”。
我不知道这里有什么错。任何想法?
我在批处理文件中的标签中执行以下命令: 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”。
我不知道这里有什么错。任何想法?
在我看来,你不能使用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
)
变量%在执行该行之前展开,因此%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
您可以通过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
易解决这个,因为
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!
但是:IF ERRORLEVEL 1是真实的,如果错误级别为1或1大,这可能是意外的行为,我更喜欢IF%ERRORLEVEL%EQU 1或IF%ERRORLEVEL%GTR 1 – jeb 2011-02-11 14:00:58
安德斯嗨,我已经在我的批处理脚本中使用了setlocal ENABLEDELAYEDEXPANSION,并按照您所描述的方式访问参数。但它没有工作。 – user613114 2011-02-11 14:03:31