Batch file 批处理%errorlevel%在FOR循环中返回0
我试图做一个循环,它将遍历指定目录中的一组文本文件,搜索字符串。根据是否找到字符串报告结果。但是Batch file 批处理%errorlevel%在FOR循环中返回0,batch-file,for-loop,Batch File,For Loop,我试图做一个循环,它将遍历指定目录中的一组文本文件,搜索字符串。根据是否找到字符串报告结果。但是%errorlevel%总是返回0并计算为0 SETLOCAL enabledelayedexpansion FOR %%G IN (*.txt) DO ( find /i "My text string" "%%G" ECHO %date% %time% : errorlevel is %errorlevel% >> %report_dir%\
%errorlevel%
总是返回0并计算为0
SETLOCAL enabledelayedexpansion
FOR %%G IN (*.txt) DO (
find /i "My text string" "%%G"
ECHO %date% %time% : errorlevel is %errorlevel% >> %report_dir%\%computername%.txt
IF %errorlevel% EQU 1 (
ECHO %date% %time% : String found >> %report_dir%\%computername%.txt
GOTO:copy_log
)
)
ENDLOCAL
雷蒙德,你是那个意思吗
SETLOCAL enabledelayedexpansion
FOR %%G IN (*.txt) DO (
find /i "My text string" "%%G"
IF %errorlevel% (
ECHO %date% %time% : String found >> %report_dir%\%computername%.txt
GOTO:copy_log
)
)
ENDLOCAL
%ERRORLEVEL%
扩展过快。您可以使用以下方法完全避免问题:
IF ERRORLEVEL 1
或有关更多详细信息,请参阅
SET/?
帮助文本中的“延迟环境变量扩展”说明:
最后,讨论了对延迟环境变量扩展的支持
补充。默认情况下,此支持始终处于禁用状态,但可能会被禁用
通过CMD.EXE的/V
命令行开关启用/禁用。请参见CMD/?
延迟的环境变量扩展有助于
当一行
文本被读取,而不是在执行时读取。下面的例子
演示立即变量展开的问题:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
将永远不会显示该消息,因为两个IF语句中的%VAR%
在读取第一个IF语句时被替换,因为它在逻辑上
包括IF的主体,它是一个复合语句。所以如果
在复合语句中,实际上是将“before”与
“之后”永远不会相等。类似地,下面的示例
无法按预期工作:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
因为它不会在当前目录中建立文件列表,
而是将LIST变量设置为找到的最后一个文件。
同样,这是因为%LIST%在
语句,此时列表变量为空。所以
我们正在执行的实际FOR循环是:
for %i in (*) do set LIST= %i
for %i in (*) do set LIST= %i
它只是将列表设置为最后找到的文件
延迟环境变量扩展允许您使用不同的
字符(感叹号)以在以下位置展开环境变量:
执行时间。如果启用延迟变量扩展,则上述
可以编写如下示例以按预期工作:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
同样,这是因为%LIST%在
语句,此时列表变量为空。所以
我们正在执行的实际FOR循环是:
for %i in (*) do set LIST= %i
for %i in (*) do set LIST= %i
它只是将列表设置为最后找到的文件
延迟环境变量扩展允许您使用不同的
字符(感叹号)以在以下位置展开环境变量:
执行时间。如果启用延迟变量扩展,则上述
可以编写如下示例以按预期工作:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
正如Raymond所说,您正在评估回声的%ERRORLEVEL%,它几乎总是(从不说从不)返回0 以下几点可以做得更好:
FOR %%G IN (*.txt) DO (
find /i "My text string" "%%G"
SET error = %errorlevel%
ECHO %date% %time% : errorlevel is %errorl% >> %report_dir%\%computername%.txt
IF %error% EQU 1 (
ECHO %date% %time% : String found >> %report_dir%\%computername%.txt
GOTO:copy_log
)
)
我更喜欢为循环调用分支。它可以防止变量扩展问题:
For %%G In (*.txt) Do Call :ScanFile "%%G"
Exit /B
:ScanFile
Find /i "My text string" "%~1"
If %ErrorLevel%==1 (
Echo %date% %time% : String found >> %report_dir%\%computername%.txt
Goto :CopyLog
)
Exit /B
:CopyLog
...
Exit /B
我在遍历注册表项/值时也遇到了同样的问题,于是我来到了这篇文章。我的“reg查询”在for循环中总是有错误级别0 以下是我的解决方案:
对于(%ToBeUninstalled%)中的%%s(
注册表查询“%KEY64%\%%s”|查找/i“卸载字符串”>NUL&&(msiexec.exe/x%%s/qb)| |(未安装回音软件)
)
KEY64是HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall如文档中所述,延迟扩展使用感叹号,立即扩展使用百分号。您仍在使用
%ERRORLEVEL%
,它将立即展开。您希望延迟,因此需要!错误等级代码>。或者你可以通过说“如果错误级别为1”来避免整个问题。这是最简单的解决方案。谢谢