在Bat批处理中,for是最为强大的命令语句,它能实现解析文本内容、遍历文件路径、数值递增/递减等操作;配合if、call、goto等流程控制语句,可以实现脚本复杂的自动化、智能化操作。
1. for命令基础
for命令,对一组文件中的每一个文件执行某个特定命令。
语法格式:
FOR %variable IN (set) DO command [command-parameters]
参数说明:
- %variable 指定
一个单一字母
可替换的参数。 - (set) 指定一个或一组文件。可以使用通配符。
- command 指定对每个文件执行的命令。
- command-parameters 为特定命令指定参数或命令行开关。
注意:
在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I。
一个简单的例子:
@echo off
for %%a in (ITPro进化论) do echo %%a
pause
运行结果:
for语句中in和do是必须有的;
in之后,do之前,也就是set的括号不能省略;
括号中的set可以是一个或多个字符串或变量,每一个字符串或变量称之为一个元素,每个元素之间可以用空格、tab键、逗号、分号、等号进行分隔;
实例:演示分隔
@echo off
echo 没有分隔的ABC
for %%a in (ABC) do echo %%a
echo 通过空格分隔的ABC
for %%a in (A B C) do echo %%a
echo 通过tab键分隔的ABC
for %%a in (A B C) do echo %%a
echo 通过分号分隔的ABC
for %%a in (A;B;C) do echo %%a
echo 通过逗号分隔的ABC
for %%a in (A,B,C) do echo %%a
echo 通过等号分隔的ABC
for %%a in (A=B=C) do echo %%a
pause
运行结果:
当括号中的ABC被分隔符分隔成3个元素后,for会对每一个元素执行一次命令,所以do后面的命令会执行3次;
第1次,把A这个字符作为变量a的值,带入do后的语句执行,输出字符A;第2次,把B这个字符替换为变量a的值,输出字符B,如此循环,第3次输出字符C,把所有元素遍历一遍后,才执行下一条命令pause。
实例:使用for语句显示当前目录下的文件名称,并查找以.md结尾的文件。
@echo off
ehco 显示当前目录下所有的文件名
for %%a in (*.*) do echo "%%a"
rem echo.是换行的意思
echo.
echo 显示当前目录下以.md结尾的文件
for %%b in (*.md) do echo "%%b"
pause
运行结果:
2. for /D 语句扩展
for /D语句的作用:如果集(set)中包含通配符,则指定与目录名匹配,而不与文件名匹配。也就是通过for /D来打印出目录名,语法格式:
FOR /D %variable IN (set) DO command [command-parameters]
实例:for语句加/D命令与不加/D命令的对比。
@echo off
echo 默认显示当前目录下的文件名
for %%a in (*) do echo "%%a"
rem echo.是换行的意思
echo.
echo 加上/D后显示当前目录下的文件夹名
for /D %%b in (*) do echo "%%b"
pause
运行结果:
实例:显示C盘下的目录,不包含子目录
@echo off
for /D %%i in (C:/*) do echo "%%i"
pause
运行结果:
3. for /R 语句扩展
检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录规范,则使用当前目录。如果集(set)仅为一个单点(.)字符,则枚举该目录树。
语法格式:
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
实例:不指定目录,显示当前目录下的所有文件,包括子目录下的文件。
@echo off
for /r %%i in (*) do echo %%i
pause
运行结果:
实例:在D盘搜索Notepad–.exe程序并打开。
@echo off
for /r D:/ %%i in (Notepad--.exe) do (
if exist %%i (
echo 找到了 Notepad--.exe
REM 去启动 Notepad--.exe
start %%i
echo 软件已启动
pause
goto end
)
)
echo 没有找到 Notepad--.exe
:end
运行结果:
4. for /L 语句扩展
for /L的作用是以增量形式从开始到结束生成一个数字序列。语法格式:
FOR /L %variable IN (start,step,end) DO command [command-parameters]
- start:创建序列的开始位置;
- step:创建序列时单步距离;
- end:创建序列结束位置;
for /L 以增量形式从start开始,每次
增加step,直到end这个数字的序列。
实例:
@echo off
echo 创建1到6的序列
for /L %%i in (1,1,6) do echo %%i
echo.
echo 创建6到1的序列
for /L %%i in (6,-1,1) do echo %%i
echo.
echo 从2开始,每次增加3,到16结束的序列
for /l %%i in (2,2,13) do echo %%i
pause
运行结果:
实例:使用for语句创建100个txt文件
@echo off
cd test
for /l %%i in (1,1,100) do (
cd>%%i.txt
)
echo 100个txt文件创建完成。
pause >nul
运行结果:
通过Bat批处理脚本创建100个txt文件只需几秒钟,效率非常高。