For循环和错误级别变量

For循环和错误级别变量

有这样简单的批处理脚本

@echo off
for /F "tokens=*" %%f in (toFind.txt) do (

    find /c "%%f" 1.txt
    
    if errorlevel 0 (
        echo %%f "--->" found 
    )   else (
        echo %%f "--->" not found!
    )
)

它总是返回... found,即使字符串(来自查找.txt文件)不存在1.txt文件...

答案1

您正在使用 MS-DOS 的旧 IF ERRORLEVEL 语法。

IF ERRORLEVEL N do_something表示“如果错误级别大于或等于 N,则执行某些操作”

由于 ERRORLEVEL 始终大于或等于 0,因此即使 FIND 返回非零错误,您也始终会收到“找到”消息。

您需要的是 Windows NT 现代版本,其中 errorlevel 是一个合适的变量。

IF %errorlevel% equ 0 do_something

但是你处于循环中,因此你需要延迟扩展,并且在 errorlevel 周围使用 ! 而不是 %

IF !errorlevel! equ 0 do_something

所以尝试一下

@echo off
setlocal enabledelayedexpansion
for /F "tokens=*" %%f in (toFind.txt) do (

    find /c "%%f" 1.txt
    
    if !errorlevel! equ 0 (
        echo %%f "--->" found 
    )   else (
        echo %%f "--->" not found!
    )
)

答案2

1.您可以使用运算符 (&& == return 0|| == return non 0) 反而errolevel

2.使用/添加UsebackqFor /F循环中,这将像在双引号中一样逐行输出,避免行包含&, (, ), |, &, <,>等时可能出现的失败。

3.通过使用setlocal EnableDelayedExpansion, 这 ”!“将不会被视为字符,无法比较两个文件中包含该字符的行。

@echo off 

for /f usebackq^tokens^=* %%f in (toFind.txt
    ) do find/c "%%~f" <1.txt >nul && (
         echo\%%~f ---^> found!
    ) || echo\%%~f ---^> not found!

其他资源:

相关内容