官方说明
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
file-set
fileset为一个或多个文件名。继续到fileset中的下一个文件之前,每份文件都被打开、读取并经过处理。
怎么理解这句话?首先每份文件都会被“打开、读取并进行处理”,说明括号中的参数SET在不加引号的情况下,这个参数代表文件。并且循环命令是对文件的内容进行操作而不是文件名(即当作字符串)来操作。
同时,命令可以针对多个文件进行操作。
处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For循环。
第二段话怎么理解?命令会将文件中的每一行当成一个循环变量进行循环操作,注意这里是每一行,而不是每行中的单个变量。
以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
这段话的意思是,虽然将每行当作一个循环变量,但是默认在读到空格或者Tab的时候会结束当前行内容的读取。
那如何才能对每行的每个字符进行操作呢? 你可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。
- eol=c - 指一个行注释字符的结尾(就一个)
- skip=n - 指在文件开始时忽略的行数。
- delims=xxx - 指分隔符集。这个替换了空格和制表符的默认分隔符集。
- tokens=x,y,m-n
- 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配
- m-n格式为一个范围。通过 nth 符号指定 mth。
- 如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
- usebackq - 指定新语法已在下类情况中使用:
- 在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 file-set中使用双引号扩起文件名称。
简单而言,常用到的参数有 skip(表示跳过文件中的前n行),delims(指定每行的分隔符,而不是默认的空格分隔符),tokens(将每行的字符分隔之后,tokens的值代表第x个,第y个或者是m到n个字符)。而*号表示可以将剩下的看作是一个变量。
栗子
FOR /F 更多的被用在对文本内容的操作,例如查找筛选等。
'command'
可以用 FOR /F 命令来分析命令的输出。方法是,将括号之间的 file-set 变成一个反括字符串。该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到内存中,并被当作文件分析。
个人觉得这个用处很大,举个例子之前处理命令的执行结果的思路通常是“先将执行结果重定向到一个文本中,然后处理文本内容(使用for+fileset),然后删除临时文本”,虽说小的脚本影响不大,但是当比较大的结果的时候一定会影响效率的,这可能也是我学艺不精的原因吧。
栗子
REM 如下实现关闭Monkey进程的功能
for /f "tokens=1,2" %%i in ('adb shell "ps |grep monkey"') do adb shell "kill %%j"