我需要找到一个字符串在文件中存在多少次。如果不等于0,则返回错误状态:
set "file=C:\output\summary.txt"
for /f %%F in (findstr /I "FAIL" %file% | find /I /C "FAIL") do (
set count=%%F
)
if count neq 0 exit /B 1
exit /B 0
但是当我运行批处理时,我得到了错误:
| was unexpected at this time.
如何解决此问题并达到预期效果?
答案 0 :(得分:1)
看来,搜索的字符串在文件中存在的频率并不重要。您似乎只想知道文件中是否包含字符串。在这种情况下,评估find.exe
或findstr.exe
的退出代码就足够了,它们都可以用来在文件中搜索字符串。如果搜索到的字符串不匹配,则两者都以1
退出,并且至少找到一个匹配项时两者都以0
退出。
@echo off
%SystemRoot%\System32\findstr.exe /L /I /M /C:FAIL "C:\output\summary.txt" >nul
if errorlevel 1 exit /B 0
exit /B 1
与上面的使用条件执行的单个命令行相同:
@%SystemRoot%\System32\findstr.exe /L /I /M /C:FAIL "C:\output\summary.txt" >nul && exit /B 1 || exit /B 0
用find.exe
执行的 /C
输出行数,其中包含可以分配给环境变量的搜索字符串:
@echo off
set Count=
for /F "tokens=3 delims=:" %%I in ('%SystemRoot%\System32\find.exe /I /C "FAIL" "C:\output\summary.txt" 2^>nul') do set /A "Count=%%I"
if defined Count if %Count% == 0 exit /B 0
exit /B 1
set /A
用于消除:
输出的文件名后find
与包含搜索字符串的行数一次或多次之间的空格字符。双引号内set /A
之后的字符串被解释为算术表达式,从而将空格字符解释为定界符,因此在将分配给循环变量I
的数字与前导空格字符从字符串转换为整数之后,没有空格字符的分配数字将作为字符串分配给环境变量Count
。
阅读有关Using Command Redirection Operators的Microsoft文章,以获取2>nul
的解释。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符>
必须在 FOR 命令行上使用脱字符号^
进行转义,才能被解释为文字字符。 FOR ,它将在后台启动的单独命令进程中执行嵌入式find
命令行。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
echo /?
exit /?
find /?
findstr /?
for /?
if /?
set /?
我建议也阅读:
我强烈建议不使用:
if %ERRORLEVEL% == 0
if %ERRORLEVEL% EQU 0
if "%ERRORLEVEL%" == "0"
if "%ERRORLEVEL%" EQU "0"
为什么?
好吧,看看将这样的退出代码评估嵌入到命令块中(如复制并粘贴到批处理文件中)会发生什么:
(
set "file=C:\output\summary.txt"
find /C "FAIL" %file%
if "%ERRORLEVEL%"=="0" (
exit /B 1
) else (
exit /B 0
)
)
在命令提示符窗口中运行此批处理文件。结果是否正确(偶然)?是的,再次运行它,无需对C:\output\summary.txt
和批处理文件进行任何修改。现在的结果与以前相反,尽管没有任何变化。查看Windows命令处理器输出的行,您知道为什么。 %ERRORLEVEL%
在执行ERRORLEVEL
之前完全被find
的当前值所代替,因为cmd.exe
在解析整个命令时始终使用语法%variable%
替换所有环境变量引用在执行留在命令块或命令块内部的任何命令之前,先执行块。
答案 1 :(得分:0)
当find
命令执行所需的操作时,这似乎非常复杂(如果找不到字符串,它将%ERRORLEVEL%
设置为1
):
set "file=C:\output\summary.txt"
find /C "FAIL" %file%
if "%ERRORLEVEL%"=="0" (
exit /B 1
) else (
exit /B 0
)