【问题标题】:Windows batch script: Check for occurrence in filesWindows 批处理脚本:检查文件中是否出现
【发布时间】:2016-08-11 01:25:11
【问题描述】:

我需要编写一个 Windows 批处理脚本。 从给定目录开始,我需要检查每个具有给定文件名的文件中是否至少出现一次给定文本。

例如: 从目录 C:\MyDir 开始,我需要检查该目录和所有子目录中是否有名为“MyFile.txt”的文件。找到的每个文件都必须至少出现一次文本“MyText”。

到目前为止,我所拥有的是:

FOR /R C:\MyDir %%f in (MyFile.txt*) do ( FINDSTR /i /c:"MyText" %%~f )

问题:

  • 这也将匹配名称为 MyFile.txtXXX 的文件
  • 它只打印出现,但不“返回”是否找到这样的出现。此代码位于批处理脚本中,如果有一个文件没有出现此类错误,则该脚本必须退出。

【问题讨论】:

  • 为什么是MyFile.txt*?这可以翻译成“找到所有(不)包含'MyText'的'MyFile.txt'”吗?
  • 是的,这就是目标:“找到所有不包含'MyText'的'MyFile.txt'

标签: batch-file


【解决方案1】:

findstr /v 在这里无法正常工作,所以你必须使用一个小技巧:使用findstr 并使用它的错误级别来查找“未找到字符串”:

for /r %%a in (myfile.txt) do findstr /i "MyText" %%a >nul && echo yes: %%a|| echo no:  %%a
  • for /r 是递归的(也在子目录中搜索)(使用for 而不是findstr /s 一个接一个地处理每个文件,以便能够检查每个单个文件的错误级别而不是完整的findstr /s 列表)李>
  • && 相当于“如果上一个命令 (findstr) 成功,那么”
  • || 相当于“如果上一个命令 (findstr) 失败,那么”

【讨论】:

    【解决方案2】:

    读取findstr /?:在文件中搜索字符串。

    FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
            [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
            strings [[drive:][path]filename[ ...]]
      …
      /S         Searches for matching files in the current directory and all subdirectories.
      …
    

    下一个命令应该找到并显示所有匹配项:

    FINDSTR /S /i /c:"MyText" C:\MyDir\MyFile.txt
    

    下一个命令应该找到所有匹配项并仅显示(完全限定的)文件名:

    FINDSTR /M /S /i /c:"MyText" C:\MyDir\MyFile.txt
    

    【讨论】:

    • 感谢您的回答。但是,使用此语句,我无法找到没有给定事件的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多