众所周知,批处理经常要用到循环。不管是认真的还是整人。这里大致收集了几种批处理的循环方式以及各种附加语句。

goto 循环

这种应该是最简单的语句了,如下:

1
2
3
4
@echo off
:start
[command]
goto start

中间的command即为要循环的语句。此时这些命令将无限循环。

可以搭配延时语句choice /t [time] /d y /n >nul实现间隔循环,例如:

1
2
3
4
5
@echo off
:start
echo man!
choice /t 5 /d y /n >nul
goto start

此时将每隔5秒输出一次man!

for 循环

这个是最为强大的语句,但是相对繁琐,此处仅介绍基本用法。

由于cmd窗口中for之后的形式变量必须使用%来引用,因此其在cmd窗口中的基本形态为:

1
For %var in (set) do command [command-parameters]

同样的,在批处理文件中for之后的形式变量必须使用%%来引用,因此其在批处理文件中的基本形态为:

1
For %%var in (set) do command [command-parameters]

注意
1.For、in和 do 不能分开使用。
2.对于var,可为26个字母的任意一个,并且区分大小写。
3.语句set两旁的括号不可省略。
4.无论何时,不能没有变量。

eg1-遍历字符:

1
2
3
@echo off
For %%i in (ABC) do @echo %%i
pause

输出结果为:

1
2
ABC
Press any key to continue...

分析:

首先,该语句将A赋予到变量i中,之后执行后面的@echo %%i命令,输出结果A。接着,该语句将B赋予到变量i中,之后执行后面的@echo %%i命令,输出结果B,如此循环直到(A B C)中所有元素被提取完毕,循环结束。

eg2-遍历换行字符:

1
2
3
@echo off
For %%i in (A B C) do @echo %%i
pause

输出结果为:

1
2
3
4
A
B
C
Press any key to continue...

如果把空格换成逗号,等号是等效的。

eg3-遍历数字:

1
2
3
4
5
6
@echo off
For /l %%i in (1, 1, 100) do (
echo %%i
echo man!
)
pause

运行后屏幕上将会打印100个”man!”。
其类似for (i=0; i<n; i++)

eg4-遍历文件:

1
2
3
For %%F in (*.txt) do (
echo %%F
)

将会遍历文件夹下所有后缀为.txt的文件。

eg5-嵌套循环:

1
2
3
4
5
For %%i in (1 2 3) do (
For %%j in (a b c) do (
echo %%i %%j
)
)

此处将两个for循环嵌套使用,输出数值将成对出现。

eg6-遍历字符串:

可以用此循环遍历字符串,并按指定分隔符分割字符串。

1
2
3
4
5
6
Set text=A,B,C
For /F "tokens=1-3 delims=," %% in ("%text%") do (
echo %%i
echo %%j
echo %%k
)

提示
“tokens=1-3” 用于指定获取前三个部分。
“delims=,” 用于指定逗号作为分隔符。

运行结果为:

1
2
3
A
B
C

do while 循环

注意
批处理中并没有此结构,只可以通过goto循环与条件判断模拟,不常用。

eg:

1
2
3
4
5
6
7
8
@echo off
Set /A counter=1
:WhileLoop
if %counter% GTR 5 goto EndLoop
echo %counter%
Set /A counter+=1
goto WhileLoop
:EndLoop

counter的初始值为1,每循环一次+1。当counter的值到5时,将结束循环。

do until 循环

注意
批处理中并没有此结构,只可以通过goto循环与条件判断模拟,不常用。
while与until是相反的。

eg:

1
2
3
4
5
6
@echo off
Set /A counter=1
:UntilLoop
echo %counter%
Set /A counter+=1
if %counter% LEQ 5 goto UntilLoop

执行结果与do while相同。

无限循环

危险
无限循环可能存在危险性,请不要滥用,更不要以此来整别人,严重情况可能导致系统崩溃,文件丢失等,后果自负!

eg1:

1
2
3
4
5
@echo off
:Loop
echo man!
timeout /t 1 >nul
goto Loop

此操作将在屏幕上持续打印”man!”,时间间隔为1秒

eg2:

1
%0 |%0

此操作将无限打开cmd.exe直到系统资源不足导致死机,可能需要重启才能恢复。