批处理 for命令
命令格式
1 | for [参数] %%变量名 in (相关文件或命令) do 执行的命令 |
对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果。
注意:
- 在
批处理文件中使用for命令时,指定变量请使用%%variable,而不要用%variable,而在cmd窗口中直接输入的for命令则使用%variable的形式。 - 变量名称是区分大小写的,所以
%i不同于%I.
for命令可以带参数或不带参数,带参数时支持以下参数:/d,/l,/r,/f.
无参数
1 | for %variable in (set) do command [command-parameters] |
%variable: 指定一个单一字母可替换的参数。(set):指定一个或一组文件。可以使用通配符。command:指定对每个文件执行的命令。command-parameters:为特定命令指定参数或命令行开关。
实例
显示当前目录下与t*.*相匹配的文件(只显示文件名,不显示路径)
1 | for %%i in (t*.*) do echo %%i |
显示d:\mydocuments\目录下与*.doc相匹配的文件
1 | for %%i in (d:\mydocuments\*.doc) do @echo %%i |
参数 /d
1 | for /d %variable in (set) do command [command-parameters] |
这个参数主要用于目录搜索,不会搜索文件,/d 参数只能指定目录下的目录名字,不会显示该目录的子目录下的目录。也就是只会搜索指定目录下的目录,不会搜索再下一级的目录。
实例
显示c盘根目录下的所有目录
1 | @echo off |
运行效果:
1 | D:\学习9\书籍\批处理>for_d.bat |
显示当前目录下名字只有1-3个字母的目录
1 | @echo off |
运行效果:
1 | D:\学习9\书籍\批处理>for_d2.bat |
参数 /R
1 | for /r [[drive:]path] %variable in (set) do command [command-parameters] |
此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。
- set中的文件名
- 如果含有通配符(
?或*),则列举/R参数指定的目录及其下面的子目录中与set相符合的所有文件,无相符文件的目录则不列举。 - 如果set中为具体文件名,不含通配符,则枚举该目录树(并在后面加上具体的文件名),而不管set中的指定文件是否存在。
- 如果含有通配符(
实例
遍历D:\dev\workspace\LatexTools目录树,列出目录树上的所有的java文件
for_r1.bat:
1 | @echo off |
运行结果:
1 | D:\学习9\书籍\批处理>for_r1.bat |
for_r2.bat:
1 | @echo off |
运行结果:
1 | D:\学习9\书籍\批处理>for_r2.bat |
参数 /L
格式:
1 | for /l %variable in (start,step,end) do command [command-parameters] |
该集(start,step,end)表示以增量Step形式从开始到结束的一个数字序列。可以使用负的Step
for /l %%i in (1,1,5) do @echo %%i- 输出:
1,2,3,4,5
- 输出:
for /l %%i in (1,2,10) do @echo %%i- 增量为2输出:
1,3,5,7,9
- 增量为2输出:
for /l %%i in (100,-20,1) do @echo %%i- 增量为-20,输出:
100,80,60,40,20
- 增量为-20,输出:
for /l %%i in (1,1,5) do start cmd–打开5个CMD窗口for /l %%i in (1,1,5) do md %%i–建立名称为1,2,3,4,5的5个文件夹for /l %%i in (1,1,5) do rd /q %%i–删除从1~5共5个文件夹
参数 /F
使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量(%%i,%%j,…)定义要检査的内容或字符串,并使用各种 options选项进一步修改解析方式。使用 options令牌选项(tokens)指定哪些令牌应该作为迭代变量.
请注意:在没有使用令牌选项时,/F将只检查第一个令牌.
文件解析过程
文件解析过程包括读取命令输出、字符串或文件内容,将其分成独立的文本行以及**再将每行解析成零个或更多个令牌**。然后通过为令牌对应的迭代变量设置值,调用for循环。
格式
1 | for /f ["options"] %variable in (file-set) do command [command-parameters] |
带引号的字符串"options"包括一个或多个
eol=c:指一个行注释字符的结尾(就一个)skip=n:指在文件开始时忽略的行数。delims=xxx:指分隔符集。tokens=x,y,m-n:指每行的哪一个符号被传递到for的迭代变量的。这会导致额外变量名称的分配。m-n格式为一个范围。通过nth符号指定mth。- 如果符号字符串中的最后一个字符为星号
*,这表示把剩下的字符留给下一个迭代变量。经测试,该参数最多只能区分31个字段。
usebackq:使用后引号(键盘上数字1左面的那个键: ` )- 未使用参数
usebackq时:file-set表示文件,但不能含有空格,- 双引号表示字符串,即”string”
- 单引号表示执行命令,即
command
- 使用参数 usebackq时:
file-set和双引号,即:"file-set",都表示文件,好处在于:当文件路径或名称中有空格时,就可以用双引号括起来.- 单引号表示字符串,即:
'sting' - 后引号(反引号)表示命令执行,即:`command`
- 未使用参数
实例
1 | @echo off |
运行结果:
1 | D:\学习9\书籍\批处理>for_f3.bat |
解释:
eol=;分号开头的行为注释行,扫描到改行for命令直接跳过。tokens=1,3*将每行第1段第3段和剩余字段(*)分别赋予变量%%i,%%j,%%kdelims=,-(减号后有一空格)以逗号``减号和空格为分隔符,空格必须放在最后
另外/F参数还可以以输出命令的结果看这个例子:
1 | @echo off |
这样你本机全部帐号名字就出来了
把扩号内的内容用两个单引号包裹起来,就表示单引号内的内容当命令来执行,
FOR会返回命令的每行结果,加那个"delims="是为了能让有空格的行能整行显示出来,不加就只显示空格左边一列!
运行结果:
1 | D:\学习9\书籍\批处理>for_f4.bat |
参考资料
http://www.hechaku.com/arcitle/201810398.html
http://www.hechaku.com/arcitle/201810344.html