批处理中的FOR循环中的IF条件

时间:2016-10-27 02:58:32

标签: batch-file

请参阅check "IF" condition inside FOR loop (batch/cmd)

我的批次

for /f "delims=" %%x in ('findstr /c:"B1" text.txt') do (
    if "%errorlevel%"=="0" (
        echo B1 found
    ) else (
        echo B1 NOT found
    )
)

如果我的text.txt文件包含B1;123(表示找到B1字符串),屏幕上会显示B1 found消息。但如果我的text.txt文件包含A;123(其中未找到B1字符串),则屏幕上不会显示B1 NOT found消息。

请让我知道我做错了什么。 非常感谢你。

2 个答案:

答案 0 :(得分:4)

您无法访问FOR / F执行的命令的返回码,因为该命令是在新的cmd.exe会话中执行的。

但是如果你想做的就是检测文件是否包含字符串,那么就不需要FOR / F循环:

findstr /c:"B1" text.txt >nul && echo B1 found || echo B1 not found

更新以回复评论

如果没有迭代行,FOR / F循环返回ERRORLEVEL 1。如果至少迭代一行,它将保持ERRORLEVEL不变。如果要像我一样使用||,则必须用括号括起整个循环。此外,您必须保证循环中的最后一个命令成功,这是(call )所做的(它将ERRORLEVEL设置为0)。

@echo off
(
  for /f "delims=" %%A in ('findstr /c:"B1" text.txt') do (
    set "str=%%A"
    echo B1 found
    (call )
  )
) || echo B1 not found

或者您可以使用该变量来确定是否存在任何迭代

@echo off
set "str="
for /f "delims=" %%A in ('findstr /c:"B1" text.txt') do (
  set "str=%%A"
)
if defined str (echo B1 found) else echo B1 not found

答案 1 :(得分:0)

再次是delayedexpansion。在for循环内,任何%variablename%都会在遇到for时被变量的实际值替换,因此%errorlevel%将替换为errorlevel的值那时errorlevel - 可能是0.

要在循环中更改时访问if errorlevel n (dothis) else (dothat) 的值,请使用常规语法

errorlevel

表示“if的当前值是n 或大于n

因此,请将if not errorlevel 1 ... 替换为

findstr

或更好地反转并重新格式化以避免双重否定 但是,正如软弱所说,因为for将为未找到的条件返回 nothing else循环无需处理,因此template<typename T, typename = std::void_t<>> struct ChooseIfType : std::false_type {}; template<typename T> struct ChooseIfType<T, std::void_t<typename T::Type>> : std::true_type {}; 子句不会达到 - 即使它是合法建造的。