一种带有两个findstr(和管道输出)的类型

时间:2012-11-14 14:16:16

标签: batch-file findstr

我有50个名为CPUNAME_installer.txt的文件,每个文件的内容类似于:

CPUNAME;11724;sdaasdasdasdasdasdasd
CPUNAME;1034;231asddasd
CPUNAME;1035;231asddasd
CPUNAME;10741;231asddasd
CPUNAME;10111;231asddasd

...依此类推,数百行。我想检查是否有代码为11724,1034或1487的行,如果为true,则将整行传送到另一个文件夹中具有相同名称的另一个文件。

目前我有这个有效的解决方案:

for %%f in (*_installer.txt) do (
    type %%f | findstr /I /C:"11724">>outfolder\%%f
    type %%f | findstr /I /C:"1034">>outfolder\%%f
    type %%f | findstr /I /C:"1487">>outfolder\%%f
)

...但由于它为每个文件执行了六个命令,因此需要花费很多时间。

是否可以通过减少每个文件(或类似文件)的命令数来改善这一点?

1 个答案:

答案 0 :(得分:5)

阅读FINDSTR文档,(从命令窗口输入HELP FINDSTR) - 您将看到FINDSTR可以一次搜索多个字符串。

由于这个错误,你使用/ I选项和多个搜索字符串是很好的:Why doesn't this FINDSTR example with multiple literal search strings find a match?

此外,无需将内容和管道TYPE到FINDSTR。您只需将文件名作为参数传递即可。

在您的情况下,由于您的字符串不包含空格,因此您的代码可能如下所示:搜索字符串由空格分隔。

for %%f in (*_installer.txt) do findstr /i "11724 1034 1487" "%%f" >"outfolder\%%f"

小心以上。如果更改搜索字符串,则可能需要添加/L选项以强制将字符串视为字符串文字而不是正则表达式。

指定多个搜索的另一种方法是使用多个/C选项。除非使用/R选项,否则这些搜索字符串始终被视为文字。

for %%f in (*_installer.txt) do findstr /i /c:"11724" /c:"1034" /c:"1487" "%%f" >"outfolder\%%f"

您可能还想调查/G:file选项。它允许您将搜索字符串放在单独的文本文件中,每行一个。您可以使用此技术方便地搜索许多字符串。

<强> P.S。

使用FINDSTR时,有许多未记录的陷阱。您可能有兴趣阅读What are the undocumented features and limitations of the Windows FINDSTR command?