bat-2-for循环
for循环
语法格式
FOR %variable IN (set) DO command
%variable
指定一个单一字母可替换的参数。(set)
指定一个或一组文件。可以使用通配符。command
指定对每个文件执行的命令。
依次提取set中的每一个元素,并赋值给形式变量variable,然后执行do后面的command命令;当执行完一次do后的语句之后,再提取set中的下一个元素,然后再赋值给variable,再执行一次command命令,如此循环,直到command中的所有元素都被提取完毕,该for语句才宣告执行结束。
-
在批处理程序中使用 FOR 命令时,指定变量请使用
%%variable
而不要用%variable
。 -
FOR 变量是单一字母、分大小写和全局的变量,所以
%i
不同于%I
. -
为了不与批处理中的
%0 ~ %9
这10个形式变量发生冲突,不要随意把%%I
替换为%%0 ~ %%9
。
基本for
for %%i in (bbs.bathome.cn) do echo %%i
===============================================
bbs.bathome.cn
for %%i in (bbs,bathome,cn) do echo %%i
===============================================
bbs
bathome
cn
高级应用:
想知道当前目录下都有哪些文件吗?请用下面的代码:
@echo off
for %%i in (*.*) do echo "%%i"
pause
想列出当前目录下所有的文本文件吗?请用下面的代码:
@echo off
for %%i in (*.txt) do echo "%%i"
pause
想列出只用两个字符作为文件名的文本文件吗?请用下面的代码:
@echo off
for %%i in (??.txt) do echo "%%i"
pause
检测当前硬盘都有哪些分区
@echo off
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 当前硬盘的分区有:
for %%i in (%str%) do if exist %%i: echo %%i:
pause
命令扩展
1. /D
输出目录下的文件列表
FOR /D %%variable IN (set) DO command
如果集中包含通配符,则指定部分与目录名匹配,而不与文件名匹配。
for /d %%i IN (D:\DirectUse\*) do ( --通配符:可以写成 *、?、*.exe
echo %%i
)
2. /l
建立数字序列
FOR /L %%variable IN (start,step,end) DO command
从start开始,增量为step,到end结束,生成一个数字序列。
(1,1,5)
将产生序列 1 2 3 4 5
,(5,-1,1)
将产生序列5 4 3 2 1
for /l %%i in (1,1,5) do ( --起始值,步长,结束值
echo %%i
)
3. /R
遍历目录搜索
FOR /R [[drive:]path] %%variable IN (set) DO command
遍历搜索[drive:]path
目录下,所有符合set规则的文件名,然后将 全文件名 赋值给形式变量variable。
-
如果在
/R
后没有指定目录,则会自动使用当前目录。 -
如果 set 中为具体文件名(不含通配符)(包含
.
),则将遍历该目录及其子目录,同时将设置的set拼接在该目录路径后面,而不管拼接后的文件路径是否存在。 -
不会遍历隐藏文件
for /r D:\DirectUse\ %%i in (*.exe) do (
echo %%i
)
为了只列举存在文件名为 123.exe 的路径,我们可改成下面这样:
for /r D:\DirectUse\ %%i in (123.exe) do (
if exist %%i echo %%i -- 判断文件是否存在
)
4. /f
文本处理
FOR /F ["options"] %variable IN (file-set) DO command --将文本文件内容作为set
FOR /F ["options"] %variable IN ('command') DO command --将命令执行结果作为set
FOR /F ["options"] %variable IN ("string") DO command --String
options参数:
eol=c - 指定每行需要忽略的结尾字符(就一个)
skip=n - 指在开始时忽略的行数。索引从1开始
delims=xxx - 指定用于分列的分隔符号,不指定则默认为空格。如果要关闭delims分隔,需要使用 `"delims="` 。
tokens=x,y,m-n - 指定需要提取分列之后的那几列数据,这些数据会被按tokens中指定的顺序,封装进以for语句中定义的形式变量开头,按字母表顺序递增,自动创建的一连串形式变量中。索引从1开始
tokens中明确显示4列,但在for语句tokens和in之间只能定义起始的形式变量,至于更多的可以在do的大括号中直接使用,至于结果集中列的封装顺序 按tokens中指定列时的顺序 依次封装进以起始形式变量开头的,按字母表顺序增长的形式变量中
如果输出结果中有空格,虽然没指定delims,但仍会使用默认的delims(空格)来分割结果,此时还没有指定tokens的话,只显示第一个分隔符前的内容,后面的内容将被忽略。
tokens=m 表示提取第m列;
tokens=m,n 表示提取第m列和第n列;
tokens=m-n 表示提取第m列至第n列;依次封装相对应数量的形式变量中;
tokens=* 表示提取从第1列开始的所有列,直到行尾,都封装进一个形式变量中;
tokens=m* 表示提取从第m列到第n列,第m列封装进声明的形式变量中,后面的所有列全部封装进后续的**一个**自动创建的形式变量中;
tokens=m,* 与 tokens=m* 一致。
- 处理文本文件(以行为单位)
for /f %%i in (C:\Users\zbf\Desktop\help.txt) do (
echo %%i
)
- 处理命令执行结果
for /f "tokens=1,2,3,4" %%a in ('dir /a') do (
echo %%a ==== %%b ==== %%c ==== %%d
)
- 处理String
for /f "tokens=1,2,3,4" %%a in ("第一列1 第二列2 第三列3 第四列4") do (
echo %%a ==== %%b ==== %%c ==== %%d
)
形式变量增强
选项语法:
%~I - 删除任何引号("),扩展 %I
%~fI - 将 %I 扩展到一个完全合格的路径名
%~dI - 仅将 %I 扩展到一个驱动器号
%~pI - 仅将 %I 扩展到一个路径
%~nI - 仅将 %I 扩展到一个文件名
%~xI - 仅将 %I 扩展到一个文件扩展名
%~sI - 扩展的路径只含有短名
%~aI - 将 %I 扩展到文件的文件属性
%~tI - 将 %I 扩展到文件的日期/时间
%~zI - 将 %I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串
可以组合修饰符来得到多重结果:
%~dpI - 仅将 %I 扩展到一个驱动器号和路径
%~nxI - 仅将 %I 扩展到一个文件名和扩展名
%~fsI - 仅将 %I 扩展到一个带有短名的完整路径名
%~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩展到类似 DIR命令的效果
在以上例子中,%I
和 PATH
可用其他有效数值代替。%~
语法用一个有效的 FOR 变量名终止。