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

Batch file 批处理脚本中的嵌套循环错误处理,batch-file,Batch File,我已经为批处理脚本中的文件比较编写了一个嵌套循环 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 ))) 要执行的逻辑是: A.如果1&2和3&4不同-回显1 b。如果1和2不同,但不是3和4-回波2 如果没有差异

我已经为批处理脚本中的文件比较编写了一个嵌套循环

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 )))
要执行的逻辑是: A.如果1&2和3&4不同-回显1

b。如果1和2不同,但不是3和4-回波2


如果没有差异,即未进入“如果”条件,则此代码工作正常。若我试着去做echo 2的需求,它实际上是在显示echo 1。不确定如何更正此问题。

当解析器准备行或行块(括号中的行)时,在开始执行代码之前,所有变量读取都将替换为变量中的值,因此,您的
%errorlevel%
在第一个
if
中的检查将使用解析所有块时使用的相同errorlevel值

您可以使用延迟扩展(
setlocal enabledelayedexpansion
)解决此问题,并在需要时将变量中的读取操作从
%var%
替换为
!瓦尔,向解析器指示读取操作必须延迟到执行命令为止

或者,您可以将检查errorlevel值的方法从
如果%errorlevel%equ…
更改为
如果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