三、循环语句
1、指定次数循环 FOR /L %variable IN (start,step,end) DO command [command-parameters]
组合命令: FOR /L %variable IN (start,step,end) DO ( Command1 Command2 …… )
2、对某集合执行循环语句。 FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 对每个文件执行的命令,可用小括号使用多条命令组合。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。如果在 /R 后没有指定目录,则使用当前 目录。如果集仅为一个单点(.)字符,则枚举该目录树。
同前面一样,command可以用括号来组合: FOR /R [[drive:]path] %variable IN (set) DO ( Command1 Command2 …… commandn )
3、条件循环 上面的循环结构是用for命令来实现的,for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题。 利用goto语句和条件判断,dos可以实现条件循环,很简单啦,看例子:
例: @echo off set var=0 rem ************循环开始了 :continue set /a var+=1 echo 第%var%次循环 if %var% lss 100 goto continue rem ************循环结束了 echo 循环执行完毕 pause
例: @echo off set var=100 rem ************循环开始了 :continue echo 第%var%次循环 set /a var-=1 if %var% gtr 0 goto continue rem ************循环结束了 echo 循环执行完毕 pause
四、子程序
在批处理程序中可以调用外部可运行程序,比如exe程序,也可调用其他批处理程序,这些也可以看作子程序,但是不够方便,如果被调用的程序很多,就显得不够简明了,很繁琐。在 WindowsXP 中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面。
子程序调用格式: CALL :label arguments
子程序语法: :label command1 command2 ...... commandn goto :eof
在子程序段中,参数%0指标签:label
子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。
子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。
传至子程序的参数在call语句中指定,在子程序中用%1、%2至%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量,请看下面的例子。
子程序例1: @echo off call :sub return 你好 echo 子程序返回值:%return% pause
:sub set %1=%2 goto :eof 运行结果:你好
子程序例2:设计一个求多个整数相加的子程序 @echo off set sum=0 call :sub sum 10 20 35 echo 数据求和结果:%sum% pause
:sub rem 参数1为返回变量名称 set /a %1=%1+%2 shift /2 if not "%2"=="" goto sub goto :eof
运行结果:65 在win98系统中,不支持上面这种标号调用,须将子程序单独保存为一个批处理程序,然后调用。
十二、随机数(%random%)的应用技巧
%RANDOM% 系统变量 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
2的15次方等于32768,上面的0~32767实际就是15位二进制数的范围。
那么,如何获取100以内的随机数呢?很简单,将%RANDOM%按100进行求余运算即可,见例子。
例:生成5个100以内的随机数 @echo off setlocal enabledelayedexpansion for /L %%i in (1 1 5) do ( set /a randomNum=!random!%%100 echo 随机数:!randomNum! ) pause 运行结果:(每次运行不一样) 随机数:91 随机数:67 随机数:58 随机数:26 随机数:20 请按任意键继续. . .
求余数运算set /a randomNum=!random!%%100中的100可以是1~32768之间的任意整数。
总结:利用系统变量%random%,求余数运算%%,字符串处理等,可以实现很多随机处理。
思考题目:生成给定位数的随机密码 解答思路:将26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。
参考答案1:(简单) @echo off call :randomPassword 5 pass1 pass2 echo %pass1% %pass2% pause exit
:randomPassword ::---------生成随机密码 ::---------%1为密码长度,%2及以后为返回变量名称 ::---------for命令最多只能区分31个字段 @echo off set password_len=%1 if not defined password_len goto :eof if %password_len% lss 1 goto :eof set wordset=a b c d e f g h i j k l m n o p q r s t u v w x y z set return=
set num=0 :randomPassword1 set /a num+=1 set /a numof=%random%%%26+1 for /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i if %num% lss %password_len% goto randomPassword1 if not "%2"=="" set %2=%return% shift /2 if not "%2"=="" goto randomPassword goto :eof
参考答案2:(最优) @echo off call :randomPassword 6 pass1 pass2 pass3 echo %pass1% %pass2% %pass3% pause exit
:randomPassword ::---------生成随机密码 ::---------%1为密码长度,%2及以后为返回变量名称 ::---------goto循环、变量嵌套、命令嵌套 @echo off if "%1"=="" goto :eof if %1 lss 1 goto :eof set password_len=%1 set return= set wordset=abcdefghijklmnopqrstuvwxyz023456789_ ::---------------------------循环 :randomPassword1 set /a numof=%random%%%36 call set return=%return%%%wordset:~%numof%,1%% set /a password_len-=1 if %password_len% gtr 0 goto randomPassword1 ::---------------------------循环 if not "%2"=="" set %2=%return% shift /2 if not "%2"=="" goto randomPassword goto :eof
说明:本例涉及到变量嵌套和命令嵌套的应用,见后。