我有一个for循环使用查找字符串搜索日志中的某个字符串,但它无法正常工作。它会在errorlevel 0中执行所有操作,即使日志中没有此类跟踪。
@Echo on
for /L %%x in (1, 1, 1000) do (
findstr /N /I /C:"MapException: Key '%%x'" "C:\Program Files (x86)\Steam\SteamApps\common\Starbound\starbound_server.log"
if %errorlevel%==0 (
Echo Memory Error at MapException: Key '%%x'!
)
)
pause
我想知道它发生了什么事?
答案 0 :(得分:1)
@Echo on
for /L %%x in (1, 1, 1000) do (
findstr /N /I /C:"MapException: Key '%%x'" "C:\Program Files (x86)\Steam\SteamApps\common\Starbound\starbound_server.log"
if not errorlevel 1 (
Echo Memory Error at MapException: Key '%%x'!
)
)
pause
为什么呢?好吧,试试这两行
(( echo hi | find "k" ) & echo %errorlevel% )
(( echo hi | find "k" ) & if errorlevel 1 echo not found )
“问题”是块内变量的扩展(括号内的行)。当执行到达一个块时,它们内部的所有变量读取都被替换为变量值块开始执行之前。当块执行时,变量可以更改其值,但是这些更改在块内部看不到,因为它们被替换为其值。
如何解决?
启用延迟扩展并使用sintax !errorlevel!
。因此,在块分析时,变量读取不会被变量值替换。块内变量的变化在块内可见。
或者,在这种情况下,由于涉及的变量是errorlevel
,请使用经典if
形式检查其值。