请参阅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
消息。
请让我知道我做错了什么。 非常感谢你。
答案 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 {};
子句不会达到 - 即使它是合法建造的。