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

jba*_*ter 8 windows-7 batch-file

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

SET TempName=%temp%\TEMP%RANDOM%.bat
c:\bin\grep.exe -i \.xml\^" MyProject.vcxproj  >> %TempName%
Run Code Online (Sandbox Code Playgroud)

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

我试过这样的事情

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
Run Code Online (Sandbox Code Playgroud)

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

dbe*_*ham 6

通常 FOR 选项括在引号内。如果您想使用引号作为选项的一部分,则必须去掉封闭引号。这意味着 CMD 解释器用作标记分隔符的所有字符都必须进行转义,包括空格和等号。引用也需要转义。

for /f tokens^=2^ delims^=^" %%F in ...
Run Code Online (Sandbox Code Playgroud)

同样的技术用于解决另一个常见问题 - 如何使用 FOR /F 并保留整行,而不管给定行的开头是什么字符。问题是 EOL 选项(默认为分号)。为了保证整条线路的保留,必须禁用 EOL。这里再次删除封闭引号,并且必须转义标记分隔符。

for /f delims^=^ eol^= %%F in ....
Run Code Online (Sandbox Code Playgroud)

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