一、前言
在批处理中,for是最为强大的命令语句,它的出现,使得解析文本内容、遍历文件路径、数值递增/递减等操作成为可能;配合if、call、 goto等流程控制语句,更是可以实现脚本复杂的自动化、智能化操作;合理使用for语句,还能使代码大为简化,免除各位编写大量重复语句之苦。
二、for语句的基本用法
1、举例:
正如色彩缤纷的七彩光芒是由红绿蓝三原色构成的一样,最复杂的for语句,也有其基本形态,它的模样是这样的:
在cmd窗口中:
FOR %variable IN (set) DO command [command-parameters]
在批处理文件中:
FOR %%variable IN (set) DO command [command-parameters]
具体例子:
For %i in (1 2 3) do @echo %i
之所以要区分cmd窗口和批处理文件两种环境,是因为在这两种环境下,命令语句表现出来的行为虽然基本一样,但是在细节上还是稍有不同。
最明显的一个差异就是:在cmd窗口中,for之后的形式变量I必须使用单百分号引用,即%i;而在批处理文件中,引用形式变量i必须使用双百分号,即%%i。
2、for语句的基本要素都有些什么:
1、for、in和do是for语句的关键字,它们三个缺一不可;
2、%%I是for语句中对形式变量的引用,就算它在do后的语句中没有参与语句的执行,也是必须出现的;
3、in之后,do之前的括号不能省略;
4、command1表示字符串或变量,command2表示字符串、变量或命令语句;
3、精髓:
1、for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I和%%i会被认为不是同一个变量;形式变量I还可以换成其他的字符,但是,为了不与批处理中的%0~%9这10个形式变量发生冲突,请不要随意把%%I替换为%%0 ~%%9中的任意一个;
2、in和do之间的command1表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔;
3、for语句依次提取command1中的每一个元素,把它的值赋予形式变量I,带到do后的command2中参与命令的执行;并且每次只提取一个元 素,然后执行一次do后的命令语句,而无论这个元素是否被带到command2中参与了command2的运行;当执行完一次do后的语句之后,再提取 command1中的下一个元素,再执行一次command2,如此循环,直到command1中的所有元素都已经被提取完毕,该for语句才宣告执行结 束;
其中,第3点是最为关键的,它描述了for语句的执行过程,是for语句的精髓所在,大家一定要牢记这一条,才能深刻理解更为复杂的for流程。
见识一下for的真正威力,检测当前硬盘都有哪些分区:
@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 current local disk:
for %%i in (%str%) do if exist %%i: echo %%i:
pause
这段代码能检测硬盘都有哪些分区,包括U盘和移动硬盘的分区,但是,当光驱中有盘的时候,也会被列出来,这是本代码的一个缺憾,在以后的讲解中,我将向大家讲述如何消除这个瑕疵,敬请关注本系列的后续章节。
高级应用:
列出当前目录下所有的文本文件:
@echo off
for %%i in (*.txt) do echo %%i
pause
列出只用两个字符作为文件名的文本文件:
@echo off
for %%i in (??.txt) do echo "%%i"
pause
3、检测文件大小并运行:
检测当前目录指定文件 temp.txt 如果这个文件大于500KB执行A 小于500KB则执行B
@echo off
for %%i in ("%~dp0\temp.txt") do (
set indexdx=%%~zi
)
if %indexdx% gtr 512000 (
rem 执行A命令
echo biger 512
)else (
rem 执行B命令
echo less 512
)
pause
4、将循环变量赋值给一个变量
预处理机制:批处理读取命令时是按行读取的(另外例如 for 命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。在不启用变量延迟,也不对变量动态捕获其扩展变化时,变量在预处理阶段不作改变
setlocal enabledelayedexpansion ,就是启用变量延迟,我们可以形象的认为是启用了“对变量动态捕获扩展变化”。而 ! 括起来的变量,就是要动态捕获扩展的目标变量,如果不需要,可以继续使用 % 括变量。
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /l %%i in (1 1 10) do (
set var=%%i
echo ----- !var! 启用延缓环境变量
echo 00000 %var% 未启用延缓环境变量
)
pause
通过不同的开关可以实现更多的功能。for语句有多个开关,不同开关将会实现不同的功能。
1)无开关
无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句。其命令格式为:
FOR %%variable IN (set) DO command
其中,%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%);set就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的command就是循环所执行的命令,即循环体。
无开关for语句举例:
@echo off
for %%i in (a,"b c",d) do echo %%i
::pause >nul 将命令的输出重定向到 nul这个空设备,不会显示任何内容
::pause >nul 表示暂停,但不在屏幕上显示提示信息
pause>nul
结果:
2)开关/L (start,step,end) step=<end
含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制。其命令格式为:
FOR /L %%variable IN (start,step,end) DO command
其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。
含开关/L的for语句举例(创建5个文件夹):
@echo off
for /l %%i in (1,2,10) do md %%i
pause
结果:
未完待续。。。
参考文章:
https://baike.baidu.com/item/%E6%89%B9%E5%A4%84%E7%90%86/1448600?fr=aladdin#5_2