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

Windows 为什么我必须在批处理文件的for循环中转义已经转义的搜索字符串?,windows,batch-file,cmd,findstr,Windows,Batch File,Cmd,Findstr,在浏览了S.O.之后,我设法将我的功能拼凑起来,使其工作,但我对它有些不了解。我基本上是想确保我想要使用的文件中没有双引号。我将findstr与返回文件名的/m选项一起使用 当我从cmd行运行命令时,它会处理以下内容: findstr /V /L /m "\"" filename.txt 如果文件名没有双引号,则返回文件名;如果文件名有双引号,则返回空白/null/任何内容。正是我想要的 所以我想用这个网站上的一个解决方案,将这个结果捕获到一个变量中。我发现这是有效的: setlocal en

在浏览了S.O.之后,我设法将我的功能拼凑起来,使其工作,但我对它有些不了解。我基本上是想确保我想要使用的文件中没有双引号。我将findstr与返回文件名的/m选项一起使用

当我从cmd行运行命令时,它会处理以下内容:

findstr /V /L /m "\"" filename.txt
如果文件名没有双引号,则返回文件名;如果文件名有双引号,则返回空白/null/任何内容。正是我想要的

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

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

echo %test%
所以我的问题是:我的搜索字符串需要转义,所以从:

"\""
并成为:

^"^\^"^" 

但我不明白我为什么要这么做。有人能解释一下吗?

要回答您的问题,您的搜索字符串需要转义(
^
转义)的原因是。。。没有一个在您的情况下,不需要转义搜索字符串

@echo关闭
setlocal enableextensions disabledelayedexpansion
对于/f“delims=”%%a in('
findstr/l/m/v“\”*.txt
“)做回显%%a
您需要
\“
转义,因为
findstr
参数处理(更多),但
^“
转义不是必需的

但在某些情况下,需要使用
^
引号scaping。在这些情况下进行转义的原因是/f的
中的命令在单独的
cmd
实例中执行。此启动实例可以(或不可以)包含自己的引号集

cmd /c " ...... "
命令中的引号可能会干扰要执行的命令的
cmd
解析


但是如果您转义引号(
cmd
escaping,即
^“
),它们将不会被解析为结束/开始引号,而是作为一个文本,对
cmd
解析器没有特殊意义,因此可以在以后隐藏它们。

从技术上讲,只有第一个引号需要转义,所以您可以说
^\”“
这对我来说效果很好:
对于/F%%G in('findstr/V/M^”““*.txt')请执行echo%%G
ahhh好的,就第一个引号。。谢谢。这至少会让它更容易阅读。我可能会像
findstr/V/L/M^“\”“filename.txt”
那样做,因为文件名看起来是引号(最佳做法是,某些特殊字符可能会导致其他问题),搜索字符串部分
^“\”
包含
cmd
观点中的平衡引号(第一个
^
转义,因此不计算;然后有两个
);这里的核心问题是
cmd
使用
^
进行转义,而
findstr
使用
\
进行转义;您必须记住
cmd
首先解析整个命令行,然后,
findstr
解释其参数……这很尴尬:)我肯定我试过了,但显然没有!谢谢你指出这一点。