批处理 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
,%%k
delims=,-
(减号后有一空格)以逗号``减号
和空格
为分隔符,空格必须放在最后
另外/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