批处理for循环中errorlevel的调用方法

4782阅读 0评论2010-07-05 benxiong
分类:WINDOWS

下面有一个批处理文件,内容如下:  

@echo off

netstat -na | findstr /C:":80" > port.txt

for /F "tokens=2 usebackq" %%j in (port.txt) do (

echo %%j

echo %errorlevel%

echo %%j | findstr /C:":80" > null

IF %ERRORLEVEL%==0 goto ok

)

 

goto bad

 

:ok

echo "Port 80 is exsit"

goto end

 

:bad

echo "Port 80 is not exsit"

 

:end exit


本来想通过此批处理,来检查机器上是否开启了80端口,如果有则显示Port 80 is exsit,如果没有则显示Port 80 is not exsit。可当我在一台根本没有启动80端口的机器上执行时,也总是显示Port 80 is exsit。为了调试,我将脚本改为如下 

@echo off 

netstat -na | findstr /C:":80" > port.txt
for /F "tokens=2 usebackq" %%j in (port.txt) do (
echo %%j
echo %ERRORLEVEL%
echo %%j | findstr /C:":80" > null
echo %ERRORLEVEL%

)


执行后,会发现ERRORLEVEL打出来的值总为0(也有可能总为1)。那么怎么解决呢,我们把脚本改成如下,就没有问题了

@echo off
setlocal enabledelayedexpansion
netstat -na | findstr /C:":80" > port.txt

for /F "tokens=2 usebackq" %%j in (port.txt) do (
echo %%j
echo !errorlevel!
echo %%j | findstr /C:":80" > null
IF !ERRORLEVEL!==0 goto ok
)

goto bad

:ok
echo "Port 80 is exsit"
goto end

:bad
echo "Port 80 is not exsit"

:end exit


这样写就没有问题了,这个问题就是涉及到变量延迟的问题。请参考变量延迟详解。
上一篇:Perl fork()
下一篇:变量延迟详解