Windows 批处理命令以查找文件中字符串的pof出现次数
我需要找出一个字符串在一个文件中存在的次数。如果不等于0,则返回错误状态:Windows 批处理命令以查找文件中字符串的pof出现次数,windows,batch-file,Windows,Batch File,我需要找出一个字符串在一个文件中存在的次数。如果不等于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. 如何解决问题并
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.
如何解决问题并达到预期效果?当
find
命令执行您需要的操作时,这似乎非常复杂(如果找不到字符串,它会将%ERRORLEVEL%
设置为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
使用/C
执行的find.exe
输出包含可分配给环境变量的搜索字符串的行数:
@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
阅读Microsoft关于的文章,了解有关2>nul
的解释。当Windows命令解释器在执行的命令之前处理此命令行时,重定向操作符必须在上用插入符号^转义,以便命令行被解释为文字字符,该命令以单独的方式执行嵌入的查找命令行命令进程在后台启动
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
echo/?
退出/?
查找/?
findstr/?
获取/?
如果/?
设置/?
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命令处理器输出的行,您知道原因<在执行find
之前,code>%ERRORLEVEL%被当前值ERRORLEVEL
替换,因为cmd.exe
在执行留在命令块或命令块内部的任何命令之前,始终使用语法%variable%
替换所有环境变量引用命令块。您必须转义一些特殊字符(如|
)。您必须将“for循环的可执行部分”用单引号括起来:for/f%%f in('findstr/I“FAIL”%file%^ | find/I/C“FAIL”')do(
。注意:这会计算包含该字符串的行数(一次或多次),而不是字符串的出现。有条件执行可以在if
时保留,并减少到一行find/i“FAIL”%file%>num&&exit/b1
(
set "file=C:\output\summary.txt"
find /C "FAIL" %file%
if "%ERRORLEVEL%"=="0" (
exit /B 1
) else (
exit /B 0
)
)