用命令实现循环
DOS的循环主要是通过FOR命令实现。
通过for,batch终于开始像一个脚本语言而不只是个命令列表,我们可以通过for做很多事情,在其中也会涉及到很多新的,甚至不同于你已知编程语言中for的用法和特性。
For可以帮助你解决需要反复执行但是带有不同参数或者值的命令,使得很多繁杂的命令集合,只需要一句话就可以实现。
首先让我们来先了解下FOR命令的基本格式:
FOR %%variable IN (set) DO command[command-parameters]
%%variable 指定一个单一字母表示可替换的参数,最常用的是%%i
(set) 指定一个或一组文件。可以使用通配符
command 指定对每个文件执行的命令
command-parameters 为特定命令指定参数或命令行开关
这样的结构可能不太好理解,即便你学习过编译语言,
这样的For格式可能也不太常用,还是让我们来点更生动
更Coooo~ool的例子吧!
知道了for的基本感念和原理之后,我们还需要了解下for的参数。
没错,for是有参数的命令,它支持四个参数,分别是:
/D /R /F /L
使用不同的参数,for的功能和效果也会有很大不同,下面我们会通过一些例子来详细说明他们。
参数 /d
FOR /D %%variable IN (set) DO command[command-parameters]
如果集(set)中包含通配符(*或?),则将对set相匹的每个目录(而不是目录中的文件组)执行指定的command。
这个参数主要用来目录搜索,不会搜索文件,例如下面的例子:
Example 2:
@echo off
for /d %%i in (????) do echo %%i
pause
参数 /r
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
1.如果set中的文件名包含通配符,则列举参数指定目录及其子目录下的所有子目录中与set项目和文件;
2.如果set中为具体文件名,则枚举该目录树;
3.如果[drive:]path不指定目录,则使用当前目录,相当于(.)字符。
/R参数和/D参数一样,都是针对文件目录的相关操作,但是功能比/D更强大和有趣,多一些例子可以帮我们更好的理解他。
参数 /l
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
这个参数将以迭代的形式设置变量,首先设置变量起始值(Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值
(End#)。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行
该命令。如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的
方式逐步执行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2
1)。
如果你学过其他编译语言,也许你可以这样理解:
参数 /f
FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %%variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %%variable IN ('command') DO command [command-parameters]
使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。请注意,在没有使用令牌选项时,/F 将只检查第一个令牌。
文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。
for中的变量
for命令中的变量,会用到一些特殊的技巧和知识,他们相当重要,而且有些难于理解,让我们先来再看一下我们的for命令:
FOR %%variable IN (set) DO command[command-parameters]
这就是for的变量,通常我们看到的是%%i,相当于其他语言中的i=,就是将in中的内容,按照指定方式迭代的赋值给i。
如果你不喜欢 i 比如你喜欢用你的名字的打头字母 z 来命名它也可以。
如果需要每次为多个变量赋值,而你只在这里申明了一个变量,系统会自动按照字母顺序新建变量,并为他们赋值。
例如只声明了 %%i,当你使用for /f (“tokens=1-3 delims=“)%%i in (text.txt) do …命令会自动把text.txt中的3列分别赋值给%%i,%%j和%%k。
GOTO 和 :
GOTO会点编程的朋友就会知道这是跳转的意思。
在批处理中允许以“:XXX”来构建一个标号,然后用GOTO XXX跳转到标号:XXX处,然后执行标号后的命令。
例:
if {%1}=={} goto noparms
if "%2"=="" goto noparms
标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号用来表示这个字符串是标签,goto
命令就是根据这个冒号(:)来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的
意图啊。例如:
@echo off
:start
set /a var+=1
echo %var%
if %var% leq 3 GOTO start
pause
等等,我刚刚好像看到了一个类似循环的效果
没错,我们可以通过:和 Goto命令,实现一个完整的条件循环结构,类似于while,让我们用一个清晰的例子看下应该怎么做: