为什么我必须在批处理文件的 for 循环中转义我已经转义的搜索字符串?

Why do I have to escape my already escaped search string in a for loop in a batch file?

拖网 S.O 之后。我设法拼凑了我的功能,因此它可以正常工作,但我对此一无所知。我基本上是在尝试确保我要使用的文件中没有双引号。我将 findstr 与返回文件名的 /m 选项一起使用。

当我 运行 来自 cmd 行的命令时,它与此一起工作:

findstr /V /L /m "\"" filename.txt

当文件名没有双引号时它 returns 文件名,如果它有双引号它 returns 空白/空/不管。正是我想要的。

所以我想使用这个网站上的解决方案在变量中捕获这个结果。我发现这个有效:

setlocal enabledelayedexpansion
set test=
for /F %%a in ('findstr /V /L /m ^"^\^"^" filename.txt') do (@set test=!test! %%a)

echo %test%

所以我的问题是:我的搜索字符串需要转义,所以来自:

"\""

并变为:

^"^\^"^" 

但我不明白为什么我必须这样做。谁能解释一下?

为了回答您的问题,您的搜索字符串需要转义(^ 转义)的原因是... none。在您的情况下,您不需要转义搜索字符串。

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /f "delims=" %%a in ('
        findstr /l /m /v  "\"" *.txt
    ') do echo %%a

您需要 \" 转义,因为 findstr 参数处理(更多 here)但 ^" 转义不是 必需的.

但有些情况下需要 ^ 引号转义。在这些情况下转义的原因是 for /f 中的命令在单独的 cmd 实例中执行。这个启动的实例可以(或不)包含它自己的一组引号

cmd /c " ...... "

您命令中的引号可能会干扰要执行的命令的 cmd 解析。

但是如果对引号进行转义(cmd转义,即^"),它们不会被解析为closing/opening引号,而是作为没有特殊含义的字面量cmd 解析器,以便稍后处理它们。