如何在Windows命令提示符中使用命令FINDSTR和OR运算符?

7

Findstr应该支持正则表达式,而我需要使用它来检查文件是否以.exe.dll结尾。然而我无法让OR操作起作用。Windows认为我试图将之前的命令传递给管道符|,而OR则被读作字面上的OR


2
findstr 使用空格来分隔 OR 匹配的搜索模式,例如 findstr /ri "\.exe$ \.dll$"。如果模式本身有空格,则可以指定多个 /c 模式,例如 findstr /ri /c:" .*\.exe$" /c:" .*\.dll$" - Eryk Sun
1个回答

11

Windows系统32目录下的findstr.exe只支持一组非常有限的正则表达式字符。在命令提示符窗口中运行findstr /?,将显示此控制台应用程序的帮助信息,其中还列出了支持的正则表达式字符及其含义。

但正如Eryk Sun在上面的评论中所解释的那样,可以在命令行上指定多个搜索字符串以构建一个简单的OR表达式。

如果有一个包含以下内容的列表文件FileNames.lst

C:\Program Files\Internet Explorer\ieproxy.dll
C:\Program Files\Internet Explorer\iexplore.exe
C:\Program Files\Internet Explorer\iexplore.exe.mui

只需要输出以.dll 或者 .exe 结尾的所有文件名,大小写不敏感,使用 findstr 命令进行输出。获取此输出的命令行如下:

%SystemRoot%\system32\findstr.exe /I /R "\.exe$ \.dll$" FileNames.lst

输出是针对FileNames.lst中的示例行:
C:\Program Files\Internet Explorer\ieproxy.dll
C:\Program Files\Internet Explorer\iexplore.exe

在正则表达式搜索字符串中,空格被解释为findstr作为两个字符串之间的分隔符。因此,findstr使用正则表达式字符串\.dll$\.exe$进行搜索,并返回其中一个表达式匹配字符串的所有行。

另一种将两个或多个正则表达式字符串进行“OR”运算的方法是在命令行上多次使用参数/C:"...",这是必要的,当正则表达式搜索字符串包含一个或多个空格时,应将其包含为搜索表达式中的文字字符。

%SystemRoot%\system32\findstr.exe /I /R /C:"\.dll$" /C:"\.exe$" FileNames.lst

使用其他命令行也可以得到同样的结果。
但是对于这个特定任务,没有必要运行正则表达式搜索,因为 findstr 还提供了参数 /E,只返回在行末找到搜索字符串的行。
%SystemRoot%\system32\findstr.exe /E /I /C:.exe /C:.dll FileNames.lst

使用"..."或者/C:"..."的区别是:
  1. "regexp1 regexp2 regexp3"表示搜索包含三个空格分隔正则表达式之一的字符串的行。可以使用/R选项明确指定这两个空格之间的三个字符串应当解释为正则表达式。建议这样做,以便让findstr和每个读者都清楚地知道,搜索字符串被解释为正则表达式。
  2. /L "word1 word2 word3"表示搜索包含三个空格分隔文字字符串之一的字符串的行。/L选项强制将这两个空格之间的三个字符串明确解释为文本字符串,而不是正则表达式。
  3. /C:"word 1" /C:"word 2" /C:"word 3"表示搜索包含三个字面解释的字符串中的一个的行,其中空格字符被解释为普通的空格符。可以使用/L选项附加使用,以便明确将三个搜索字符串解释为字面字符串。建议这样做,以便让findstr和每个读者都清楚地知道,搜索字符串被解释为字面字符串。
  4. /R /C:"reg exp 1" /C:"reg exp 2" /C:"reg exp 3"表示搜索包含三个空格分隔的正则表达式字符串之一的行,其中空格字符被解释为普通的空格符。使用/R选项强制将这三个字符串明确解释为带有空格符解释的正则表达式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接