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

时间:2016-12-06 12:35:02

标签: windows batch-file cmd findstr

浏览S.O.我设法拼凑了我的功能,所以它有效,但我不了解它。我基本上试图确保我想要使用的文件中没有双引号。我使用了带有/ m选项的findstr,它返回了文件名。

当我从cmd行运行命令时,它可以使用:

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

当filename没有双引号时,它返回文件名,如果它有双引号,则返回blank / null / whatever。正是我想要的。

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

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

echo %test%

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

"\""

并成为:

^"^\^"^" 

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

1 个答案:

答案 0 :(得分:1)

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

@echo off
    setlocal enableextensions disabledelayedexpansion

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

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

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

cmd /c " ...... "

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

但如果你转义引号(cmd转义,即^"),它们将不会被解析为结束/打开引号,而是作为一个没有{{1的特殊含义的文字解析器,所以他们以后可能会被打包。