为什么我必须在批处理文件的 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
解析器,以便稍后处理它们。
拖网 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
解析器,以便稍后处理它们。