FOR
FOR %%variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
在批处理程序中使用 FOR 命令时:
- 指定变量请使用 %%variable而不要用 %variable
- 变量名称是区分大小写的,所以 %i 不同于 %I
- 循环体内有多条语句时,可以在DO后面用小括号包含,但是 "do (" 必须在一行
1. 基本用法
for %%i in (0,1,10) do (
echo %%i
)
依次输出数组 0,1,10(这里用空格隔开与,隔开效果一样)
set list=1,2,3,4,5
for %%i in (%list%) do (
echo %%i
)
定义数组并输出数组中字符(逗号分割也可以用空格)
for %%i in ("0,1,10") do (
echo %%i
)
若是用引号包含,就会直接输出该字符串,且字符串带引号(若是 echo %%~i 就不会带引号)
for %%i in (C:\*.*) do (
echo %%i
)
遍历c盘下的所有文件,不包括文件夹和文件夹里面的文件,输出绝对路径
for %%i in (C:\*.txt*) do (
echo %%i
)
遍历c盘下的所有txt文件,输出绝对路径
for %%i in (??.txt) do (
echo %%i
)
遍历运行路径下的名称长度为2的txt文件,并输出相对路径(调用的是绝对路径就会输出绝对路径)
2. 扩展用法(/D)
只能遍历相对路径下的文件夹(不包括子路径),输出相对路径
for /d %%p in (*) do (
echo %%p
)
输出所有运行路径下的文件夹的相对路径,不包括子文件夹
for /d %%p in (e*) do (
echo %%p
)
输出运行路径下的以e开头的文件夹的相对路径,不包括子文件夹(*e 表示以e结尾)
2. 扩展用法(/L)
简单for循环,遍历一个数值集合
for /L %%i in (0,1,10) do (
echo %%i
)
该集表示以增量形式从开始到结束的一个数字序列。
(1,1,5) 将产生序列1 2 3 4 5
(1,2,5) 将产生序列1 3 5
(5,-1,1) 将产生序列5 4 3 2 1
3. 扩展用法(/R)
遍历路径下的文件夹和文件(包括子路径),输出绝对路径
for /r %%i in (.) do (
echo %%i
)
遍历运行路径下的所有文件夹,包括本身和子文件夹(用/和\与.一样的功能),输出绝对路径但是最后会以.结尾
for /r %%i in (*) do (
echo %%i
)
遍历运行路径下的所有文件,包括子文件夹下的文件,并输出绝对路径
for /r C:\ %%i in (*) do (
echo %%i
)
遍历对应文件夹下的所有文件,包括子文件夹下的文件,并输出绝对路径
for /r C:\ %%i in (*.txt) do (
echo %%i
)
遍历对应文件夹下的所有txt文件,包括子文件夹下的文件,并输出绝对路径
4. 扩展用法(/F)
遍历文件中的数据,并按要求输出
for /f %%s in (1.txt) do (
echo %%s
)
读取运行路径下的1.txt,并显示每一行的内容(每一行内容遇到空格即终止,即只显示每一行第一个空格之前的字符,空行不输出)
for /f %%i in (1.txt 2.txt) do (
echo %%i
)
依次读取运行路径下的1.txt和2.txt文件
for /f "eol=s" %%i in (1.txt) do (
echo %%i
)
读取运行路径下的1.txt,并显示第一个字符不是s的行信息,每行信息遇到空格终止(eol只能数值一个字符)
for /f "skip=2" %%i in (1.txt) do (
echo %%i
)
读取运行路径下的1.txt,跳过前2行输出
for /f "delims=," %%i in (1.txt) do (
echo %%i
)
读取运行路径下的1.txt,并显示每一行内容(每一行信息遇到,终止)
for /f "delims=,;" %%i in (1.txt) do (
echo %%i
)
读取运行路径下的1.txt,并显示每一行内容(每一行信息遇到,或;终止)
for /f "tokens=1,2,3" %%a in (1.txt) do (
echo %%a %%b %%c
)
读取运行路径下的1.txt,并显示每一行内容(每一行信息以空格分割,第一个为%%a,第二个为%%b,第三个为%%c,小于3个时显示为空)
例:
1 2 3 echo 1 2 3
1 2 echo 1 2
1 2 3 4 echo 1 2 3
PS:变量名需根据字母表顺序,这里for循环中定义的是a,这表示第二个就是b,第三个是c
for /f "tokens=1-3" %%a in (1.txt) do (
echo %%a %%b %%c
)
1-3 相当于 1,2,3
for /f "tokens=1-3,*" %%a in (1.txt) do (
echo %%a %%b %%c %%d
)
*表示%%d是后续的所有的字段
例:
1 2 3 4 5 6 a=1 b=2 c=3 d=4 5 6
for /f "eol=s delims=; tokens=*" %%a in (1.txt) do (
echo %%a
)
组合使用,相互之间以空格隔开
for /f %%a in ("C:\1.txt") do (
echo %%a
)
输出字符串 C:\1.txt
for /f "usebackq" %%a in ("C:\1.txt") do (
echo %%a
)
usebackq指示集中的是文件路径,主要用来处理带空格的文件路径(若是用的是单引号,表示的是字符串)
for /f "usebackq" %%a in (`set`) do (
echo %%a
)
``中的字符串会被当作命令执行,并遍历执行后的结果
另外,FOR 变量参照的替换已被增强。你现在可以使用下列选项语法: %~I - 删除任何引号("),扩展 %I 可以组合修饰符来得到多重结果: %~dpI - 仅将 %I 扩展到一个驱动器号和路径
|
5.变量延迟
批处理解释代码时,是先读出当前行的代码并解析,for及之后的代码也是一次加载并解释的。这就导致for之后的代码中的变量设置了并没有立即生效。如果想要立即生效,需要启用变量延迟。
- setlocal enabledelayedexpansion
启用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。 - setlocal disabledelayedexpansion
禁用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
setlocal enabledelayedexpansion
for /L %%i in (1,2,60) do (
set /a val=%%i+1
echo var1=%%i var2=!val!
)
endlocal
setlocal enabledelayedexpansion
for /L %%i in (1,1,100) do (
set /a val+=%%i
echo !val!
)
echo %val%
endlocal