我可以使用FOR/F处理文件和命令,文件和字符串或少数文件,但没有其他组合.为什么?

npo*_*aka 7 cmd batch-file

这是我的代码:

@echo off

echo ->minus
echo _>underscore
rem if this file  is used it tries to execute a command
echo not-at-all>'notacomand'

echo processing two files at once
for /f "delims=" %%# in (minus underscore ) do echo %%#
echo processing file and command
for /f "delims=" %%# in (minus '"echo ++"') do echo %%#
echo processing files and string
for /f "delims=" %%# in (minus underscore  "zzz") do echo %%#

rem searches for file "zzz" minus
rem for /f "delims=" %%# in ("zzz" minus) do echo %%#

rem searches for file  zzz" minus 
rem for /f "delims=" %%# in ("zzz" minus) do echo %%#

echo the command at the end is not processed
for /f "delims=" %%# in (minus "zzz" 'echo ---') do echo %%#

rem searches for file 'echo 
rem for /f "delims=" %%# in (minus  'echo ---' "zzz") do echo %%#
Run Code Online (Sandbox Code Playgroud)

在Windows 8.1和Windows XP上测试过.] :-).

我测试了很少的组合,但到目前为止我的结论是:

  1. 您可以一次处理任意数量的文件useback.不接受使用外卡.应使用带空格的文件.
  2. 您可以一次处理任意数量的文件puls ONE命令(但使用额外的双引号)或string.字符串或命令之后的所有内容都将被忽略,语法错误除外.

不知道为什么(很可能没有cmd代码的答案是不可能的.)也不知道这是否有用或者是已知的行为,但绝对是好奇的.

Χpẘ*_*Χpẘ 1

我很确定您遇到过不明确的文档和一两个错误的情况。

我相信文档试图传达的是 /f 具有三个互斥的选择:文件集、字符串、命令输出。帮助中的一段以“您还可以对立即字符串使用 FOR /F 解析逻辑”开头。我认为“an”的真正意思是“一”。同样,下一段说:“...命令的输出...”。我再次认为“a”意味着一。我对互斥的推理是它或多或少是如何实现的。

我声称的错误之一是,如果单个字符串位于文件集的末尾,则它会作为字符串工作。另一个可能是对已注意到的引号字符的奇怪解析。

我认为高级解析算法类似于:1)查找左括号,2)如果第一个非空白是引号字符,则对字符串或命令情况使用适当的处理程序。3) 如果第一个字符不是引号或指定了 usebackq 并且第一个字符是双引号,则执行文件集情况 4) 如果前一个标记是文件规范,则继续解析,但如果前一个标记不是文件规范,则停止解析

4) 解释文件集末尾单个字符串的行为

字符串解析算法似乎是:1)在打开括号之后查找开始引号作为第一个引号,2)在关闭括号之前查找结束引号作为最后一个引号,3)之间的所有内容都是字符串(或命令)4)引号不甚至不必保持平衡。以下所有行为均与此解释一致:

rem space is delimiter
for /f "tokens=1,2*" %i in ( "zzz" "yyy" ) do echo i %i j %j k %k
rem unbalanced quotes
for /f "tokens=1,2* delims=" %i in ( 'echo zzz' yyy' ) do echo i %i j %j k %k
rem apostrophe is delimiter
for /f "tokens=1,2* usebackq delims='" %i in ( 'zzz' 'yyy' ) do echo i %i j %j k %k
Run Code Online (Sandbox Code Playgroud)