批处理脚本中的嵌套循环错误处理
Nested loop error handling in batch script
我在批处理脚本中编写了一个用于文件比较的嵌套循环。
fc 1.txt 2.txt | findstr "no diff"
IF %ERRORLEVEL% EQU 1 (
fc 3.txt 4.txt | findstr "no diff"
IF %ERRORLEVEL% EQU 1 (
echo 1
goto exit
) ELSE (
echo 2
goto exit )))
要执行的逻辑是:
一个。如果 1&2 和 3&4 不同 - echo 1
b。如果 1&2 不同但 3&4 不同 - echo 2
如果没有差异,即没有进入 "if" 条件,则此代码可以正常工作。如果我尝试对 echo 2 做要求,它实际上显示的是 echo 1。不知道如何纠正这个问题。
当解析器准备好行或行块(括号中的行)时,所有读取的变量都将替换为变量中的值 before 开始执行代码,因此您的 %errorlevel%
检查在第一个 if
内将使用与解析所有块时使用的相同的错误级别值。
您可以使用延迟扩展 (setlocal enabledelayedexpansion
) 解决它,并在需要的地方将变量中的读取操作从 %var%
替换为 !var!
,向解析器指示读取操作必须延迟到命令执行。
或者您可以更改检查错误级别值的方式,从 if %errorlevel% equ ...
更改为 if errorlevel n
如果 errorlevel
值等于或大于指定的 n
值。
在这种情况下,它使用的语言结构不涉及变量读取操作,并且不受解析时值替换的影响
fc 1.txt 2.txt >nul
if errorlevel 1 (
fc 3.txt 4.txt >nul
if errorlevel 1 (
echo 1
) else (
echo 2
)
)
这是另一种方法。
fc 1.txt 2.txt | findstr "no diff" && goto :done
fc 3.txt 4.txt | findstr "no diff" && (echo 2 & goto :done)
echo 1
:done
我在批处理脚本中编写了一个用于文件比较的嵌套循环。
fc 1.txt 2.txt | findstr "no diff"
IF %ERRORLEVEL% EQU 1 (
fc 3.txt 4.txt | findstr "no diff"
IF %ERRORLEVEL% EQU 1 (
echo 1
goto exit
) ELSE (
echo 2
goto exit )))
要执行的逻辑是: 一个。如果 1&2 和 3&4 不同 - echo 1
b。如果 1&2 不同但 3&4 不同 - echo 2
如果没有差异,即没有进入 "if" 条件,则此代码可以正常工作。如果我尝试对 echo 2 做要求,它实际上显示的是 echo 1。不知道如何纠正这个问题。
当解析器准备好行或行块(括号中的行)时,所有读取的变量都将替换为变量中的值 before 开始执行代码,因此您的 %errorlevel%
检查在第一个 if
内将使用与解析所有块时使用的相同的错误级别值。
您可以使用延迟扩展 (setlocal enabledelayedexpansion
) 解决它,并在需要的地方将变量中的读取操作从 %var%
替换为 !var!
,向解析器指示读取操作必须延迟到命令执行。
或者您可以更改检查错误级别值的方式,从 if %errorlevel% equ ...
更改为 if errorlevel n
如果 errorlevel
值等于或大于指定的 n
值。
在这种情况下,它使用的语言结构不涉及变量读取操作,并且不受解析时值替换的影响
fc 1.txt 2.txt >nul
if errorlevel 1 (
fc 3.txt 4.txt >nul
if errorlevel 1 (
echo 1
) else (
echo 2
)
)
这是另一种方法。
fc 1.txt 2.txt | findstr "no diff" && goto :done
fc 3.txt 4.txt | findstr "no diff" && (echo 2 & goto :done)
echo 1
:done