【问题标题】:Batch script to search strings in text file; echo string found or not found用于在文本文件中搜索字符串的批处理脚本;找到或未找到回显字符串
【发布时间】:2016-11-29 03:00:19
【问题描述】:

我需要一个 CMD 脚本,它能够基于 findstr 命令搜索文本文件,其中包含多个要搜索的字符串。


在这种情况下,我创建了一个包含命令结果的文本文件(kb.txt)

wmic qfe list

我需要的脚本将读取文件并使用findstr 命令搜索它,例如:

findstr "kb3199321 kb3175631 kb3155567 kb3143345"

如果没有找到字符串,就会输出没有找到的字符串。那些被发现的也是如此。输出示例:

kb3199321 not found
kb3175631 found
kb3155567 found
kb3143345 not found

脚本应该遍历 findstr 命令的所有字符串(不仅仅是上面列出的 4 个,可能是几十到几百个),并且对于每个字符串,如果找到字符串,则回显。


注意

如果findstr 命令太有限(它不能搜索超过一百个字符串),那么脚本应该从另一个单独的文本文件中读取所有字符串(例如“searchfile.txt "),然后在 "kb.txt" 中搜索,看看它是否能够找到字符串,并回显与上面相同的想要的结果

【问题讨论】:

    标签: batch-file cmd


    【解决方案1】:

    您不能搜索所有字符串并单独显示结果。您必须独立搜索每个字符串,然后检查返回值以了解该字符串是否存在。

    另一个问题是wmic 以UTF-16 打印其输出,但findstr doesn't work with Unicode 所以你必须使用find(这对于这种情况来说已经足够了)。

    您可以将要搜索的字符串逐行放入搜索文件中,然后使用for /F 循环遍历该文件的内容

    @echo off
    
    for /F %%f in (searchfile.txt) do (
        find /i "%%f" kb.txt >NUL
        if errorlevel 1 (
            echo %%f not found
        ) else (
            echo %%f found
        )
    )
    

    如果您想将findstr 用于更多功能,则需要将wmic 输出转换为ANSI。有关如何执行此操作的信息,请参阅

    【讨论】:

    • 不需要这么复杂。 errorlevel 不会被call 更改,因此无需将其作为参数传递给子例程,因此无需调用delayedexpansion。当前的错误级别可以通过常规的if errorlevel 语法来解释,所以调用子程序也是大材小用
    • @Magoo 感谢您提供这些信息,但正如我检查过的call isn't on the list of [commands that doesn't set errorlevel。我已将 if 移入循环并按照您的建议删除了子例程
    • 我相信可能是 call 被省略以防止后续“更正”的数量,期望 errorlevel 在通过 @987654339 执行子过程的主过程中没有改变@.
    • 您不能搜索所有字符串并单独显示结果。您必须独立搜索每个字符串,然后检查返回值以了解该字符串是否存在。 是的,我就是这样做的。但是当我不得不检查超过 3 打的字符串(或 KB)时,我需要某种“for”循环来执行此操作,这成为一个非常大的问题。我确实有一个想法,但我是脚本的入门级。这确实完全解决了问题,也可以出于其他目的进行编辑。我希望其他人觉得它有用,因为我在网上找不到解决方案。非常感谢!
    • 如果你findstr 一次所有字符串,那么所有这些搜索字符串的结果将在一个地方输出,你必须再次解析它的输出,这要复杂得多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2020-05-11
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多