批处理脚本中的嵌套循环错误处理

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