Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理%errorlevel%在FOR循环中返回0_Batch File_For Loop - Fatal编程技术网

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”来避免整个问题。这是最简单的解决方案。谢谢