Windows 为什么我必须在批处理文件的for循环中转义已经转义的搜索字符串?
在浏览了S.O.之后,我设法将我的功能拼凑起来,使其工作,但我对它有些不了解。我基本上是想确保我想要使用的文件中没有双引号。我将findstr与返回文件名的/m选项一起使用 当我从cmd行运行命令时,它会处理以下内容: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
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
解释其参数……这很尴尬:)我肯定我试过了,但显然没有!谢谢你指出这一点。