[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 applba 于 2011-5-25 21:20 编辑

我在补充一点,for /f的各个option之间的空格可以省略。不知道火星了吗?

::普通符号做分隔符
for /f "skip=1 tokens=3,4 delims=<>"
for /f "skip=1tokens=3,4delims=<>"

::引号做分隔符
for /f tokens^=1-3^ delims^=^"
for /f tokens^=1-3delims^=^"
2

评分人数

TOP

本帖最后由 applba 于 2011-5-26 10:42 编辑

继续补充,for /f "option" %%a in (set)
如果set中没有使用双引号时(但可能使用了单引号、反引号)出现特殊符号是需要使用^转义符号的。
  1. @ECHO OFF
  2. ECHO.
  3. SETLOCAL ENABLEDELAYEDEXPANSION
  4. :: Use WMIC to retrieve date and time
  5. FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
  6. IF NOT "%%~F"=="" (
  7. SET /A SortDate = 10000 * %%F + 100 * %%D + %%A
  8. SET /A SortTime = 10000 * %%B + 100 * %%C + %%E
  9. SET SortTime=0000000!SortTime!
  10. SET SortTime=!SortTime:~-6!
  11. )
  12. )
  13. SET Sort
  14. pause
复制代码
上面的例子中转义了逗号和管道符号。

TOP

16# zm900612

for确实是一个特别的命令,有一定的解释功能。

TOP

本帖最后由 applba 于 2011-5-26 19:40 编辑

19# zqz0012005


虽然我没认真学过C,但是还是看懂了,这个对原理解释的比较透,但是有官方根据吗?还是自己想象出来的呢?或者是逆向的?

TOP

本帖最后由 applba 于 2011-5-26 20:38 编辑

运行前,cmd.exe对命令字符串进行一些处理,主要是特殊符号的解释。
还包括分辨出哪些是命令名,哪些是参数,具体依据是各种特殊符号(空格、逗号等分隔符)。

cmd.exe对一个“命令字符串”进行识别时,第一个空格之前的内容被识别为“命令名”。
例证:for^ /l %%i (1,1,5) echo %%i ,这里转义了第一个空格,结果运行提示
'for' 不是内部或外部命令,也不是可运行的程序或批处理文件。
第一个空格之后的剩余字符串,如果有可用的分隔符,会继续进行进行参数的分割。
如果使用了双引号或者^等转义了这些分隔符,第一个空格之后的所有剩余字符串会被当作一个整体参数传递。

for运行时,会再次识别这些转义后的特殊符号(空格,逗号等参数分隔符),并自行对他们进行解释(如参数分割)。
当然了如果上面一部的预处理已经分离出了全部或者部分的参数,下面不会重复进行分离。

for的自行解释过程是按照顺序进行的,首先看第一个空格后有没有 /开关,比如是for /f。
例子 for  /f delims^=^+   %%a in ("123+456")  do echo %%a
接着看下一个空格后是不是option,这个option必须是一个连续的字符串。
如果有空格,option会被分割,这个空格后的内容会被当作下一个参数。
但是for 此时只认为下一个参数只能是%%a,所以运行是提示 “此时不应有 *”。
如果有option中有空格或者其他特殊字符导致option被分割时,需要使用引号或者^来。

我觉得各个option之间的处理是通过关键字来判断的,即空格是是切割参数的,而不是切割option的
处理到option参数时,里面的空格会被丢弃。

处理完option之后,下一个空格后的内容只能是%%i,如果不是提示非法。
下一个空格后就是双括号了,再下一个空格之后就是do关键字了,如果不是提示非法……
下一个空格后就是具体的命令、语句或者语句块了,这个没什么好说的了……

%%i经过运行前的预处理,成为了%i,%i在for运行时被解释,即替换(或扩展)成具体的值。



同样call也能再次识别转义后的特殊符号,包括% ^和空格等。
只是call和for的解释机制有出入。

TOP

23# applba


我总结一下:
运行前的预处理,如果有可用的(即没有被转义)分隔符(如空格、逗号等)是会进行参数分割的。
如果没有可用分隔符,把第一个空格后的所有字符串作为一个整体参数传递。
这个过程是cmd .exe来完成的。

有些命令运行时会再次识别转义后的特殊字符,并再次启动解释工作。
比如call会再次识别转义后的%、^、空格等。
for也会再次识别转义后的空格等

TOP

36# zqz0012005


由于某些原因,在运行前的预处理时 没有能够分割参数,这些参数会被作为一个整体传递给具体命令然后由具体命令再次进行参数分割。for和call会这么做的。当然有些命令是不会这么做的,比如echo。

TOP

返回列表