我在编写软件时经常使用命令行程序“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:""^>" *
。