有这样简单的批处理脚本
@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.使用/添加Usebackq
在For /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!
其他资源: