如何在 Windows 7 上的 CMD.exe 中使用“(引号)作为 FOR /F 分隔符

如何在 Windows 7 上的 CMD.exe 中使用“(引号)作为 FOR /F 分隔符

我想要一个 .bat 文件来获取 Visual Studio 项目中所有 *.XML 文件的列表我到目前为止尝试的是首先使用旧版本的 GREP:

SET TempName=%temp%\TEMP%RANDOM%.bat
c:\bin\grep.exe -i \.xml\^" MyProject.vcxproj  >> %TempName%

但我需要从该临时文件中获取文件名

我尝试过

FOR /F "tokens=2 delims="" %%F IN (%TempName%) DO ECHO %%F
FOR /F "tokens=2 delims=^"" %%F IN (%TempName%) DO ECHO %%F
FOR /F 'tokens=2 delims="' %%F IN (%TempName%) DO ECHO %%F

但它们都不起作用。似乎分隔符"被视为选项列表的结束引号,这就是为什么我^在第二次尝试时尝试用它进行转义。

答案1

通常,FOR 选项都括在引号中。如果要将引号用作选项的一部分,则必须删除括起来的引号。这意味着 CMD 解释器用作标记分隔符的所有字符都必须转义,包括空格和等号。引号也需要转义。

for /f tokens^=2^ delims^=^" %%F in ...

同样的技巧也用于解决另一个常见问题 - 如何使用 FOR /F 并保留整行,而不管给定行以什么字符开始。问题在于 EOL 选项(默认情况下为分号)。要保证保留整行,必须禁用 EOL。这里再次删除了括起来的引号,并且必须转义标记分隔符。

for /f delims^=^ eol^= %%F in ....

DELIMS 设置为空,因为 DELIMS 选项中永远不会包含空格,除非它是最后一个指定的选项。后面的下一个选项字符串字符EOL= 将被视为 EOL 字符。但在这种情况下,不存在下一个字符,因为空格没有转义,也没有被引用。因此,上述语法同时禁用了 DELIMS 和 EOL。

答案2

引号标记了文字字符串的边界,其中的元字符不会被解析。这包括转义字符,通常是插入符号,因此第二次出现的双引号不能被转义。通常,标记文字字符串结尾的符号将始终结束文字字符串。

如果要防止解析“字符,则必须使用不带引号的插入符号对其进行转义。不幸的是,for 的选项字符串通常包含大量需要转义的字符,并且可读性明显受到影响。如果不使用临时文件,该命令将扩展为:

for /F usebackq^ tokens^=2^ delims^=^" %i in (`findstr /I /R \.cpp\^" MyProj.vcxproj`) do @echo %i

请注意,如果所需标记不是第二个,则不会产生正确的结果。进一步嵌套 for 循环和 findstr 命令可以轻松纠正此问题,但语法会非常混乱,可能超出了本问题的范围。

相关内容