本章节主要介绍 for 语句的基础知识:
for 语句是对一组文件中的每一个文件执行某个特定命令。基本格式如下:
REM 在 CMD 窗口中 FOR %variable IN (set) DO command [command-parameters] REM 在批处理文件中 FOR %%variable IN (set) DO command [command-parameters]
参数说明:
%variable 指定一个单一字母可替换的参数,该参数用来存放 for 语句每次迭代的数据。
(set) 指定一个或一组文件,可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
注意:在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I。
for 语句依次提取 set 中的每一个元素,把它的值赋予形式变量 variable,带到 do 后的 command2 中参与命令的执行;并且每次只提取一个元素,然后执行一次 do 后的命令语句,而无论这个元素是否被带到 command2 中参与了command2 的运行;当执行完一次 do 后的语句之后,再提取 command1 中的下一个元素,再执行一次 command2,如此循环,直到 command1 中的所有元素都已经被提取完毕,该 for 语句才宣告执行结束。
实例:在 CMD 窗口执行简单的 for 循环。
C:\Users\Administrator>for %I in (ABC) do echo %I C:\Users\Administrator>echo ABC ABC
实例2:在批处理文件中定义一个非常简单的 for 循环,输出指定的字符串。
@echo off for %%I in (ABC) do ( echo %%I ) pause
如果你习惯将 for 和后面的命令写在一行,可以将上面实例修改如下:
@echo off for %%I in (ABC) do echo %%I pause
输出结果:
C:\Users\Administrator\Desktop> test.bat ABC 请按任意键继续. . .
for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I 和 %%i 会被认为不是同一个变量;形式变量I还可以换成其他的字符,但是,为了不与批处理中的 %0~%9 这 10 个形式变量发生冲突,请不要随意把 %%I 替换为 %%0~%%9 中的任意一个。实例:
@echo off for %%A in (ABC) do echo %%A for %%I in (ABC) do echo %%I for %%Z in (ABC) do echo %%Z REM %%J 和 %%j 是不同的两个变量 for %%J in (ABC) do echo %%j pause
输出结果:
C:\Users\Administrator\Desktop>test.bat ABC ABC ABC %j 请按任意键继续. . .
in 和 do 之间的 command1 表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔。
实例:演示使用空格、分号、逗号和等号分割 command1。
@echo off for %%I in (A B C) do echo %%I for %%I in (A;B;C) do echo %%I for %%I in (A,B,C) do echo %%I for %%I in (A=B=C) do echo %%I pause
输出结果:
C:\Users\Administrator\Desktop>test.bat A B C A B C A B C A B C 请按任意键继续. . .
现在,来分析上面代码中 for 语句的执行过程:
(1)for语句以空格、分号、逗号和等号为分隔符,把 A,B,C 这个字符串切分成三个元素:A、B和C,由此决定了do后的语句将会被执行3次。
(2)第一次执行过程是这样的:先把 A 这个字符串作为形式变量 I 的值,带入 do 后的语句中加以执行,也就是执行 echo %%I 语句,此时的 I 值为 A,因此,第一次执行的结果,将会在屏幕上显示 A 这个字符串;第二次执行和第一次执行的过程是一样的,只不过此时 I 的值已经被替换为 command1 中的第二个元素了,也就是 B 这个字符串;如此循环,当第三次 echo 执行完毕之后,整条 for 语句才算执行完毕;此时,将执行下一条语句,也就是 pause 命令。
(1)使用批处理文件打印当前目录下面所有的文件名称。如下:
@echo off for %%i in (*.*) do echo "%%i" pause
输出结果:
C:\Users\Administrator\Desktop>test.bat "for.txt" "test.bat" 请按任意键继续. . .
(2)使用批处理文件打印当前目录下面所有后缀为 txt 的文件名称。如下:
@echo off for %%i in (*.txt) do echo "%%i" pause
输出结果:
C:\Users\Administrator\Desktop>test.bat "for.txt" 请按任意键继续. . .