为什么这个“findstr”命令不能按预期运行?

为什么这个“findstr”命令不能按预期运行?

我在编写软件时经常使用命令行程序“findstr”。它可以帮助我在一组子目录中快速找到包含特定字符串的所有文件。在很多情况下,使用“findstr”比其他任何方法都快得多。今天我遇到了一个问题,我想找到字符串“>,所以我运行了这个命令(我认为这是一个相当典型的转义字符串):

findstr /sic:"\">" *

并收到此神秘的错误信息:“文件名、目录名或卷标语法不正确。”

将其更改为:

findstr /sic:'\">' *

运行正常。为什么我需要使用单引号而不是双引号?我之前运行过数百(也许数千?)个 findstr 命令,其中我在双引号包装器内转义了双引号,没有任何问题。是什么让这个特定的搜索字符串如此不同?

答案1

这里有两个级别的处理 - 首先cmd.exe是解析命令行以确定是否需要发生重定向等,然后findstr获取剩余的命令行并根据自己的规则进行自己的解析(实际上,通常对于各种程序都是相同的)。

MSDN 博客文章详细阐述了这一主题。

在我看来,由于>cmd.exe元字符,所以您需要的是cmd.exe转义字符,而转义字符恰好是^。例如,此命令对我有用:

findstr /sic:"\"^>" *

答案2

该字符>用于重定向,如果是文字字符串的一部分,通常需要用插入符号进行转义。将字符串括在引号中将阻止解析元字符,并且无需进行转义。这就是为什么echo ">"echo ^>都会打印实际的大于号,而不是尝试重定向输出。

双引号的第二次出现始终标记文字字符串的结尾。它无法转义,因为插入符号不会被解析为元字符;它位于引号之间。因此,和都echo "">"echo "^">"尝试重定向输出,在本例中重定向到无效文件。

在第一行中,findstr /sic:"\">" *第二个双引号被解释为文字字符串的结尾。下一个字符表示重定向输出。后续文件名确实无效;抛出的错误几乎不难理解。预期参数的其余部分甚至对 findstr 命令都不可见,它只能执行/sic:"\"。如果您想坚持使用双引号,则以下语法将按预期运行:findstr /sic:""^>" *

相关内容