Cmd 我可以处理一个文件和命令,文件和字符串,或者几个带有FOR/F的文件,但没有其他组合。为什么?

Cmd 我可以处理一个文件和命令,文件和字符串,或者几个带有FOR/F的文件,但没有其他组合。为什么?,cmd,batch-file,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

这是我的密码:

@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 %%#
在Windows 8.1和Windows XP上测试。]:-)

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

  • 您可以一次处理任意数量的文件。通配符不是 接受。对于带有空格
    的文件,应使用useback
  • 通过一个命令(但附加双引号),您可以一次处理任意数量的文件 或字符串。字符串或命令之后的所有内容都将被忽略 除了语法错误

  • 不知道为什么(很可能没有cmd代码的答案是不可能的)。也不知道这是否有用或是已知的行为,但肯定是好奇

    我敢肯定您遇到过文档不明确和一两个bug的情况

    我相信文档试图传达的是/f有三个相互排斥的选择:文件集、字符串和命令输出。帮助中的一段以“您还可以对立即字符串使用FOR/F解析逻辑”开头。我认为“一”的真正含义是“一”。类似地,下一段说,“…命令的输出…”。我再次认为“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
    

    有趣的是,/f“delims=“%%#in(减去“zzz”'test3.bat')do echo%%#的一行
    导致在Windows XP上出现错误消息
    无法找到文件“test3.bat”。
    尽管当前工作目录中有
    test3.bat
    。批处理文件名末尾的单引号被解释为文件名的一部分,而第一个单引号被删除。这是我们不久前在DosTips遇到的问题:。如果你阅读整个线程,你会发现这种奇怪的行为导致了XP中的一个讨厌的错误。我认为这与CMD.exe中对双引号的异常处理有关。例如,
    For/f“tokens=1,2*delims=“%%a in”(“更多”要“解析”)执行回显“%%a”、“%%b”、“%%c”
    会导致
    更多要“解析”的“事物”被解析为单个字符串。“正常”双引号的解析将它们成对进行,有时会给您一个转义字符,以便您可以在带引号的字符串中包含双引号。然而,在CMD中,嵌入在文件名中的双引号通常被简单地去掉。尝试键入
    dir“mi”nus”
    。这与关于2的
    dir-minus
    dir“minus”
    相同:如果命令包含空格或其他分隔符,则只需用附加的双引号将其括起来;行
    for/f“delims=“%%#in(减去'echo.+')do echo%%
    有效。