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%%
有效。