Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理命令以查找文件中字符串的pof出现次数_Windows_Batch File - Fatal编程技术网

Windows 批处理命令以查找文件中字符串的pof出现次数

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. 如何解决问题并

我需要找出一个字符串在一个文件中存在的次数。如果不等于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.

如何解决问题并达到预期效果?

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
    )
)