批处理命令行for语句
- 格式:doc
- 大小:34.00 KB
- 文档页数:13
bat文件中for用法在批处理(batch)文件中,`for` 命令用于循环处理一系列文件或文本行。
下面是 `for` 命令的一些基本用法和示例:1. 基本的 `for` 循环:```batchecho offfor %%i in (1 2 3 4 5) do (echo %%i)```2. 使用 `do` 命令:```batchecho offfor %%i in (1 2 3 4 5) do (echo This is loop %%i)```3. 使用 `in` 命令中的文件:```batchecho offfor %%i in ( ) do (echo %%i has %%~zi bytes )```4. 遍历文件中的每一行:```batchecho offfor /f "tokens=" %%i in () do ( echo %%i)```5. 使用 `delims` 设置分隔符:在处理文本文件时,你可以设置分隔符,以便按特定的格式解析每一行。
例如,假设有一个以逗号分隔的文本文件:```batchecho offfor /f "tokens=1,2 delims=," %%i in () do (echo Column1: %%i, Column2: %%j)```6. 结合 `if` 命令:你还可以在 `for` 循环内部使用 `if` 命令进行条件判断:```batchecho offfor %%i in (1 2 3 4 5) do (if %%i lss 3 (echo Less than 3) else (echo More than or equal to 3))```7. 跳过循环的迭代:可以使用 `continue` 和 `break` 来控制循环的行为:```batchecho offfor %%i in (1 2 3 4 5) do (if %%i == 3 (continue) else (echo %%i))```8. 使用 `set` 命令修改变量:在循环内部,你可以使用 `set` 命令来修改变量的值:```batchecho offsetlocal enabledelayedexpansionfor %%i in (1 2 3 4 5) do (set /a "count+=1"echo Loop count: !count! - %%i)```以上是 `for` 命令的一些基本用法和示例。
批处理文件BAT的命令及使用1. echoecho命令用于在命令行窗口上显示文本或变量的内容。
用法:echo <文本>2. setset命令用于设置或显示环境变量。
用法:set <变量名称>=<值>3. ifif命令用于执行条件判断,根据条件的满足与否执行相应的操作。
用法:- 单个条件:if <条件> <命令>- 多个条件:if <条件1> <命令1> else if <条件2> <命令2> else <命令3>4. forfor命令用于循环操作,并可以对文件、文件夹、字符串等进行遍历操作。
用法:- 遍历文件/文件夹:for /r <路径> %变量 in (<通配符>) do <命令>- 数字循环:for /l %变量 in (<起始值>, <步长>, <结束值>) do<命令>5. callcall命令用于调用另一个批处理文件,并在调用完成后返回当前文件。
用法:call <批处理文件路径>6. startstart命令用于启动一个新的命令行窗口或程序,并可指定窗口标题、运行目录等选项。
用法:start <选项> <程序或文件路径>7. pausepause命令用于暂停批处理的执行,直到用户按下任意键才继续执行下一条命令。
用法:pause8. cdcd命令用于更改当前目录。
用法:cd <目录路径>9. mdmd命令用于创建一个新的目录。
用法:md <目录路径>10. deldel命令用于删除文件或文件夹。
用法:- 删除文件:del <文件路径>- 删除文件夹:del /s <文件夹路径>11. copycopy命令用于复制文件、文件夹或目录。
批处理命令行中for循环基本用法for循环是在办公自动化中非常实用的语句之一,本节讨论DOS语言中for循环的各种模式:如/r,/d,/l,/f等,以及各种参数:如tokens,delims,usebackq等的基本用法。
我们须要根据实际情况选择不同的模式和参数来配置for循环以达到我们的目的。
1、【for语句的常规用法】形式1:for %%i in (字符串集合/数字列表/…) do 命令语句@echo offfor %%i in (aa,bb,cc) do echo %%ipause结果为:aabbcc注:这里如果用点进行分割,字符串会作为一个整体输出如果用逗号分割,则会一次一个单次进行打印。
判断某个磁盘是否存在,如果盘符存在,则输出它:@echo offecho 存在有驱动器:for %%i in (a,b,c,d,e,f,g) if exist %%i: echo %%ipause显示当前目录下的文件名称(非文件夹,文件夹将不会被列出):@echo offfor %%i in (*.*) do echo "%%i"pause仅显示当前目录下的txt文件名称(通配符*.txt的用法):@echo offfor %%i in (*.txt) do echo "%%i"pause把txt换成其他扩展名亦可仅列出其他格式的文件名仅显示当前目录下的txt文件名称(通配符?规定字符个数):@echo offfor %%i in (??.txt) do echo "%%i"pause仅会输出当前目录下文件名为2个字符的txt文件名2、【关于for语句的/f模式(遍历文件内容模式)】①/f模式/f模式用于遍历文件中的内容:@echo offfor /f %%i in (test.txt) do echo %%ipause运行的结果,会逐行打印test.txt文件中的内容②delims参数(表示分隔符)使用delims提取每一行在特定符号之前的内容;当设置delims为逗号(,)时,只显示每一行逗号之前内容;@echo offfor /f "delims=," %%i in (test.txt) do echo %%i pause如果识别切分的符号有多个,则可以直接继续在第一个后面写,例如:"delims=.,"此时会先判定是否有英文句号,如果没有则再判断有没有英文逗号。
批处理-for命令详解⼤纲⼀前⾔⼆ for语句的基本⽤法三 for /f (delims、tokens、skip、eol、userbackq、变量延迟)四 for /r (递归遍历)五 for /d (遍历⽬录)六 for /l (计数循环)⼀、前⾔在批处理中,for是最为强⼤的命令语句,它的出现,使得解析⽂本内容、遍历⽂件路径、数值递增/递减等操作成为可能;配合if、call、goto等流程控制语句,更是可以实现脚本复杂的⾃动化、智能化操作;合理使⽤for语句,还能使代码⼤为简化,免除各位编写⼤量重复语句之苦。
⽽能否熟练使⽤for语句,已经成为衡量⼀个⼈批处理⽔平⾼低最主要的标准。
在这个系列教程中,我将通过实际应⽤中频繁出现的例⼦,带领⼤家步⼊for语句的神奇之门,⼀步步迈向for语句的魔幻殿堂,使得⼤家在实际的应⽤中,能独⽴写出简洁⾼效的代码,在批处理的世界⾥⾃由驰骋。
注意:以下的讲解,都是基于简体中⽂版Windows XP Pro SP3的操作系统环境。
⼆、for语句的基本⽤法正如⾊彩缤纷的七彩光芒是由红绿蓝三原⾊构成的⼀样,最复杂的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。
为了⽅便起见,若不是特别强调,以下的讲解都以批处理⽂件环境为例。
BAT语句结构类似于C语言,批处理也有它的语句结构。
批处理的语句结构主要有选择结构(if语句)、循环结构(for语句)等。
if语句(选择结构)if语句实现条件判断,包括字符串比较、存在判断、定义判断等。
通过条件判断,if语句即可以实现选择功能。
1、字符串比较if语句仅能够对两个字符(串)是否相同、先后顺序进行判断等。
其命令格式为:IF [not] string1 compare-op string2 command1 [else command2]其中,比较操作符compare-op有以下几类:== - 等于EQU - 等于NEQ - 不等于LSS - 小于LEQ - 小于或等于GTR - 大于GEQ - 大于或等于选择开关/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非。
字符串比较示例:===============================================@echo offset str1=abcd1233set str2=ABCD1234if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!) if /i %str1% LSS %str2% (echo str1^<str2) else (echo str1^>=str2) echo.set /p choice=是否显示当前时间?(y/n)if /i not %choice% EQU n echo 当前时间是:%date% %time%pause>nul===============================================对于最后一个if判断,当我们输入n或N时的效果是一样的,都不会显示时间。
如果我们取消开关/i,则输入N时,依旧会显示时间。
另外请注意一下几个细节:1-echo str1^<str2和echo str1^>=str2;2-echo.。
批处理文件语法批处理文件是无格式的文本文件,它包含一条或多条命令。
它的文件扩展名为 .bat 或 .cmd。
在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。
使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。
当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用,例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。
下面就开始我们批处理学习之旅吧。
一.简单批处理内部命令简介1.Echo 命令打开回显或关闭请求回显功能,或显示消息。
如果没有任何参数,echo 命令将显示当前回显设置。
语法echo [{on off}] [message]Sample:@echo off / echo hello world在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。
2.@ 命令表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。
Sample:@echo off@echo Now initializing the program,please wait a minite...@format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。
)3.Goto 命令指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
语法:goto label (label是参数,指定所要转向的批处理程序中的行。
)Sample:if {%1}=={} goto noparmsif {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。
For [ %varable |%%varable] in(set) do commandfor 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
1) for {%variable | %%variable} in (set) do command [command-parameters]%variable 指定一个单一字母可替换的参数。
变量名称是区分大小写的,所以 %i 不同于 %I在批处理文件中使用 FOR 命令时,指定变量建议用 %%variable而不要用 %variable。
(set) 指定一个或一组文件。
可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
FOR命令就是把读取的东西,然后赋值给变量。
FOR有4个参数/d、 /l 、 /r 、 /f每个参数的意思分别如下:/d:仅为目录(directory)如果Set (也就是我上面写的"相关文件或命令")包含通配符(*和?),将对与Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的Command。
/R:递归(recursion)进入根目录树[Drive:]Path,在树的每个目录中执行for语句。
如果在/R后没有指定目录,则认为是当前目录。
如果Set只是一个句点(.),则只枚举目录树。
/L:迭代数值范围(location)使用迭代变量设置起始值(Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值(End#)。
/L将通过对Start#与End#进行比较来执行迭代变量。
/f:迭代及文件解析使用文件解析来处理命令输出、字符串及文件内容。
使用迭代变量定义要检查的内容或字符串,并使用各种Pars in gKeywords选项进一步修改解析方式。
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到支持:a.FOR /D %variable IN (set) DO command [command-parameters]/D 仅为目录如果集里面包含通配符,则指定与目录名匹配,而不与文件名匹配。
FOR命令中有一些变量,他们的用法许多新手朋友还不太了解,今天给大家讲解他们的用法!先把FOR的变量全部列出来:~I - 删除任何引号("),扩展%I%~fI - 将%I 扩展到一个完全合格的路径名%~dI - 仅将%I 扩展到一个驱动器号%~pI - 仅将%I 扩展到一个路径%~nI - 仅将%I 扩展到一个文件名%~xI - 仅将%I 扩展到一个文件扩展名%~sI - 扩展的路径只含有短名%~aI - 将%I 扩展到文件的文件属性%~tI - 将%I 扩展到文件的日期/时间%~zI - 将%I 扩展到文件的大小%~$PATH:I - 查找列在路径环境变量的目录,并将%I 扩展到找到的第一个完全合格的名称。
如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串我们可以看到每行都有一个大写字母"I",这个I其实就是我们在FOR带入的变量,我们FOR语句代入的变量名是什么,这里就写什么.比如:FOR /F %%z IN ('set') DO @echo %%z这里我们代入的变量名是z那么我们就要把那个I改成z,例如%~fI改为%~fz至于前面的%~p这样的内容就是语法了!好开始讲解:一、~I - 删除任何引号("),扩展%I这个变量的作用就如他的说明,删除引号!我们来看这个例子:首先建立临时文件temp.txt,内容如下"1111"2222"3333""4444"44"55"55"55可建立个BAT文件代码如下:@echo off2echo ^"1111>temp.txt3echo "2222">>temp.txt4echo 3333^">>temp.txt5echo "4444"44>>temp.txt6echo ^"55"55"55>>temp.txt复制代码rem 上面建立临时文件,注意不成对的引号要加转义字符^,重定向符号前不要留空格7FOR /F "delims=" %%i IN (temp.txt) DO echo %%~i8pause9del temp.txt复制代码执行后,我们看CMD的回显如下:1111 #字符串前的引号被删除了2222 #字符串首尾的引号都被删除了3333" #字符串前无引号,后面的引号保留4444"44 #字符串前面的引号删除了,而中间的引号保留55"55"55 #字符串前面的引号删除了,而中间的引号保留请按任意键继续. . .和之前temp.txt中的内容对比一下,我们会发现第1、2、5行的引号都消失了,这就是删除引号~i的作用了!删除引号规则如下(BA T兄补充!)1、若字符串首尾同时存在引号,则删除首尾的引号;2、若字符串尾不存在引号,则删除字符串首的引号;3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。
CMD批处理(4)——批处理循环语句结构FOR函数,对⼀组⽂件批量执⾏命令,基本模式如下1.⽂件搜索 for [/D] [/R [路径]] %%变量 in (集合) do (命令)2.等差数列 for /L %%变量 in (开始,间隔,结束) do (命令)3.⽂本处理 for /F ["选项"] %%变量 in (集合) do (命令)⽂件搜索命令⽤法:for [/D] [/R [路径]] %%变量 in (集合) do (命令)/D 只搜索⽂件夹名[可选],若⽆该选项即为只搜索⽂件名/R [路径] 搜索⼦⽬录[可选],如果在 /R 后没有指定⽬录规范,则使⽤当前⽬录。
如果集仅为⼀个单点(.)字符,则枚举该⽬录树。
路径搜索指定⽬录[可选]%%变量可以是⼀个字母(不区分⼤⼩写),数字,或符号,⽤于在命令中使⽤,代表搜索结果。
在若是在命令⾏中⽤%(⼀个),批处理程序中使⽤ FOR 命令时,指定变量使⽤ %%(两个)。
集合指定⼀个或⼀组⽂件。
可以使⽤通配符搜索。
(允许指定多个搜索条件⽤空格分隔 "带空格的搜索条件⽤双引号括住")(当搜索条件不包含通配符时不搜索直接输出因此也可以⽤来指定⽂本⽤空格分隔 "带空格⽂本⽤双引号括住")命令 指定批量执⾏的命令。
使⽤%%变量指定搜索结果。
例1、显⽰当前⽂件夹(不含⼦⽂件夹)下所有bat⽂件的⽂件名for %i in (*.bat) do echo %i例2、计算game⽬录下及所有⼦⽬录下⼀共有多少⽂件for /r game %i in (*) do set a+=1例3、计算多个数字的乘积@echo off:startset /p n=请输⼊多个数字,⽤空格隔开:set c=1for %%i in (%n%) do set /a c*=%%iecho %a%的乘积为%c%goto :start注意:for搜索并不会搜索隐藏⽂件等差数列命令⽤法:for /L %%变量 in (开始,间隔,结束) do (命令)(开始,间隔,结束)表⽰从开始到结束的⼀个数列,间隔为数列差。
DOS批处理命令:for循环详细说明及例子详细说明及例子:对一组文件中的每一个文件执行某个特定命令普通格式:FOR %variable IN (set) DO command [command-parameters] •%variable 指定一个单一字母可替换的参数。
•(set) 指定一个或一组文件。
可以使用通配符。
•command 指定对每个文件执行的命令。
•command-parameters 为特定命令指定参数或命令行开关。
在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable。
变量名称是区分大小写的,所以 %i 不同于 %I.范例:如c:/temp/myfile.txt内容如下,共4行•;a1,a2,a3,a4,a5•b1,b2,b3,b4,b5•c1 c2 c3 c4 c5•d1,d2,d3,d4,d5例:for %i in (my*) do @echo %i 结果:myfile.txt (显示文件名)扩展格式:FOR /D %variable IN (set) DO command [command-parameters]如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配(只搜索指定目录下的目录,不再搜索指定目录下的目录的子目录,不搜索文件名)。
例:for /d %i in (*) do @echo %i 结果:是当前目录下的目录FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录规范,则使用当前目录。
如果集仅为一个单点(.)字符,则枚举该目录树。
例:for /r %i in (*.txt) do @echo %i 列举当前目录下的所有txt 文件:不指定目录即为当前目录例:for /r . %i in (.) do @echo %i 列举当前目录下的所有目录,含子目录:例:for /r . %i in (5.txt) do @echo %i 列举当前目录下所有5.txt 的文件:注意“子目录”下没此文件,但依然列出来了,因为“子目录”-“电影2”下有5.txt文件例:for /r c:/tmp %i in (5.txt) do @echo %i 列举c:/tmp目录下所有的5.txt文件,但此目录及子目录下根本没有5.txt文件,结果列出来了目录结构FOR /L %variable IN (start,step,end) DO command [command-parameters]该集表示以增量形式从开始到结束的一个数字序列。
批处理中常用命令介绍(Echo、rem、goto、call、pause、if、for)一、echo命令(echo图文版)1. Echo :显示当前ECHO的状态:ECHO ON 或者ECHO OFF 。
2. ECHO ON :ECHO状态设为ON,将显示命令行(如每行前的C:\>等类似标志)。
3. ECHO OFF:CHO状态设为OFF,将不显示命令行(如每行前的C:\>等类似标志) 。
4. ECHO 字符串:将输入的字符串显示在CMD屏幕上。
5. ECHO 字符串&ECHO 字符串… :&,类似and的意思,逻辑运算,用来显示多行数据。
6. ECHO 字符串>文件路径和文件名:将字符串写入文件中,若已有数据将先清空后写入。
7. ECHO 字符串>>文件路径和文件名:将字符串写入文件中,若已有数据将追加到末尾。
注意每次:ECHO 字符串>>文件路径和文件名,命令之后,ECHO就回自动在在字符串后添加换行符,所以要想直接添加到文件末尾,那么文件中已有的数据,不能是ECHO命令先前输入的(或者手工删掉换行符)8. (ECHO 字符串&ECHO 字符串…)>文件路径和文件名:将多行数据写入文件中(注意括号不能去掉,如果括号去掉的话,那么只能写入最后一个,前面的将输出在CMD窗口中。
如果文件中已经有数据,将先自动清空后再写入。
9. (ECHO 字符串&ECHO 字符串…)>>路径和文件名将多行数据写入文件中(注意括号不能去掉,如果括号去掉的话,那么只能写入最后一个,前面的将输出在CMD窗口中。
如果文件中已经有数据,就将该字符串追加到文件的末尾。
10. (ECHO 字符串)>>文件路径和文件名:在文件中另起一行追加上字符串。
如图所示:11. ECHO.:输出空行,即相当于输入一个回车注意命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。
windows命令⾏for⽤法for /r ⽬录名 %i in (匹配模式1,匹配模式2) do @echo %ifor /r SATA %i in (*.txt) do @echo %iD:\REY\test>for /r "D:\REY\SATA" %i in (*.doc) do move /y "%i" .for /r . %i in (*.doc) do move /y "%i" 01-WORDfor /r "D:\REY\SATA" %i in (*.doc,*.docx) do move /y "%i" "D:\REY\test\01-WORD"for /r "D:\REY\SATA" %i in (*.xls,*.xlt,*.xlsx) do move /y "%i" "D:\REY\test\01-EXCEL"========================================= copy 测试 ================================================for /r "D:\REY\SATA" %i in (*.doc,*.docx) do copy /y "%i" "D:\REY\test\01-WORD"for /r "D:\REY\SATA" %i in (*.xls,*.xlsx) do copy /y "%i" "D:\REY\test\02-EXCEL"for /r "D:\REY\SATA" %i in (*.ppt,*.pptx) do copy /y "%i" "D:\REY\test\03-PPT"for /r "D:\REY\SATA" %i in (*.pdf) do copy /y "%i" "D:\REY\test\04-PDF"for /r "D:\REY\SATA" %i in (*.rar,*.zip) do copy /y "%i" "D:\REY\test\05-RAR_ZIP"========================================= move 操作 ================================================for /r "D:\REY\SATA" %i in (*.doc,*.docx) do move /y "%i" "D:\REY\test\01-WORD"for /r "D:\REY\SATA" %i in (*.xls,*.xlsx) do move /y "%i" "D:\REY\test\02-EXCEL"for /r "D:\REY\SATA" %i in (*.ppt,*.pptx) do move /y "%i" "D:\REY\test\03-PPT"for /r "D:\REY\SATA" %i in (*.pdf) do move /y "%i" "D:\REY\test\04-PDF"for /r "D:\REY\SATA" %i in (*.rar,*.zip) do move /y "%i" "D:\REY\test\05-RAR_ZIP"for /r "D:\REY\SATA" %i in (*.jpg,*.jpeg,*.png) do move /y "%i" "D:\REY\test\06-IMAGE"for /r "D:\REY\SATA" %i in (*.txt,*.chm,*.rtf) do move /y "%i" "D:\REY\test\07-OtherFile"=========================================拓展 ================================================格式:FOR [参数] %%变量名 IN (相关⽂件或命令) DO 执⾏的命令 作⽤:对⼀个或⼀组⽂件,字符串或命令结果中的每⼀个对象执⾏特定命令,达到我们想要的结果。
for语句可以在命令行提示符中使用,也可以在批处理文件中使用。
这两种情况下唯一的区别是%和%%,参加下文说明。
一、for语句的格式:for [参数] 变量in (集合) do 命令[命令的参数]二、for语句的作用:对集合内的元素逐一执行后面的命令。
1、如:for %%i in (你好) do echo %%i将在屏幕上显示“你好”2个字。
这里集合是“你好”,执行的命令是“echo”。
由于集合中只有1个元素,因此循环只运行一次。
如果改成for %%i in (你好朋友) do echo %%i将会显示2行文字,第一行为“你好”,第二行为“朋友”。
因为2个词之间有空格,因此集合中就有了2个元素,循环将运行2次。
2、注意:以上for语句的运行方式是新建一个批处理文件,即扩展名为“.bat”的文件,内容为上面的命令,然后运行。
为了批处理执行完不退出,可在最后加上一条pause>null命令,这样能看到执行的结果。
要想通过cmd命令行执行的话,必须将%%换成%,即去掉一个%,如下:for %i in (你好) do echo %i3、以下所有例子都是这样,若要在命令行提示符下执行,请将所有的%%改成一个%。
三、for语句详细说明:上面语句格式中有的加了中括号[],表示这个语句元素不是必须的,只在需要时使用。
像刚才显示“你好”的命令中就没有使用[参数]这个语句元素。
所有语句元素间用空格隔开。
各语句元素的写法:for、in、do这3个符号是固定不变的1、[参数]的种类:只有4种,分别是/d、/r、/l、/f(即目录Directory、递归recursion、序列list、文件file),他们用于对后面的集合的含义做出解释,请与下面的集合解释结合来看。
这4个参数不区分大小写,可以联合使用,即一条for语句可以出现多个参数。
2、变量:除10个数字外(0-9)的所有符号(因为0-9往往作为形参使用,为了与此区别),变量名一般用单个字母表示即可,而且变量名区分大小写,即A和a是两个不同的变量。
变量名前面必须是%,当在命令提示符下执行时,只用一个%;而在批处理程序中,必须用%%。
一行语句中,一般只需定义一个变量。
使用/f参数中的tokens 选项可以将集合中的元素分解成多个值,并自动定义新的变量对应这些值。
这时语句中可以使用多个变量,通常按字母顺序命名,即第一个是%%a,那么后一个就用%%b。
如果第一个是%%i,后一个就用%%j。
依此类推。
具体看后面的相关内容。
变量可以直接在do后面的命令中使用。
每次使用的变量总数不超过52个。
3、集合:集合必须放在括号里。
集合是一行文本,这行文本可能有几种类型,如“你好”只是一串字符;“c:\boot.ini”是一个文件;“dir /b”是一个命令。
(1)如果for语句中没有使用任何参数,对待集合文本的处理方式是:第一步:如果集合文本用一对百分号(%)括起来,则系统在执行for 循环时首先查找前面定义的变量中是否有与百分号内文本相同的,有则以该变量值替换掉集合文本,否则集合文本不变,进入第三步。
举例:设当前目录为D盘根目录,且根目录存在文件hello.txt、study.txt。
set stuname=hello.txtfor %%i in (stuname) do echo %%i ;将显示stuname。
for %%i in (%ttuname%) do echo %%i ;将显示%ttuname%,因为没有这个变量。
for %%i in (%stuname%) do echo %%i ;将显示hello.txt,哪怕这个文件不存在,也仍然显示这个名字。
for %%i in (%stuname%) do echo %%~ti ;将显示hello.txt文件的最后修改日期。
如果文件不存在,则不显示任何东西。
这个命令只是验证这里是把hello.txt优先作为一个文件来处理的。
第二步:如果集合文本用一对半角双引号(以下在谈及标点符号时均为英文半角,不再说明)括起来了,则先去掉双引号,再看是否被百分号括着。
如果引号内的文本用百分号括起来了,则查找是否存在相应的变量名。
存在的话,用变量值替换掉变量,再用双引号括起来作为集合文本,否则集合文本不变,进入第三步。
举例:继续上面的例子for %%i in ("%stuname%") do echo %%~ti ;和不加双引号效果相同。
for %%i in ("stuname") do echo %%i ;直接显示"stuname"。
for %%i in ("stuname teachname") do echo %%i ;直接显示"stunameteachname"。
这里是把引号内内容作为整体处理的,注意与不加双引号的区别。
第三步:如果集合文本被双引号括着的话,先去掉双引号。
然后检查当前目录下是否存在同名的目录或文件。
如果存在,将该文件作为集合元素处理(这里也接受通配符,如*.txt。
如果用了通配符,有匹配的文件(不含目录)的,将这些文件名各作为集合的一个元素。
没有匹配的,则循环结束,输出情况依命令而定)。
如果不存在这样的目录或文件,再看原来是否有双引号,有就作为一行文本对待,整体作为集合元素处理。
这时集合将只有一个元素,for循环也只能循环一次就退出。
如果原来没有双引号括着,再看该文本有没有用空格或逗号分隔。
没有的话,则集合只有一个元素,否则根据分隔符把文本分成多个部分,每个部分单独作为集合的一个元素。
参见开篇的例子。
举例:继续上面的例子for %%i in ("hello.txt") do echo %%~ti ;显示这个文件的时间for %%i in (hello.txt) do echo %%~ti ;显示这个文件的时间,加不加双引号没区别。
for %%i in (*.txt) do echo %%i ;显示当前目录下(不含子目录)所有文本文件的名字,自然也包括hello.txt和study.txt。
而且加了双引号结果也一样。
for %%i in (hello study) do echo %%i ;两个单词分两行显示for %%i in ("hello study") do echo %%i ;显示"hello study",即如果不存在这样的文件,而且字符串中有分隔符的话,有没有双引号效果就不同了。
(2)在前面的例子中,for语句可以接受通配符,但通配符只匹配文件名(没有通配符的,可以是文件也可以是目录)。
如果只想处理目录名而不是文件名时,就可以加参数了。
/d参数——仅目录,如果集合文本中包含通配符(*、?),则将当前目录下的所有符合条件的目录名(不含子目录中的目录)作为集合的元素,如果没找到符合条件的目录名,则集合元素为空。
如果没有任何通配符,则与没有参数效果相同。
举例:接前面的例子,设D盘根目录下还存在soft目录for /d %%i in (*ft*) do echo %%~ti ;显示soft的时间for /d %%i in (*llo*) do echo %%~ti ;没有任何输出,此时不匹配文件,去掉/d参数后就可以显示hello.txt文件的时间了问号用于匹配一个字符,星号匹配任意个字符。
常见的用法有:*、*.*、*.mp3、?、*bc*.*、?xx*.*等,表示不同的名称条件。
/r参数——递归,前面讲的for语句都只对当前目录处理,不能深入到子目录中。
这个参数可以让前面的文件或目录匹配功能深入到子文件夹中,这在查找算法中叫做递归,即不断重复这个过程,直到所有目录及子目录都查找过为止。
与/d参数联用的话,查找所有目录名。
否则只查找所有文件,不处理目录名。
加了这个参数后,如果集合文本中有通配符,则按要求查找,找到显示,找不到不显示。
如果没有通配符,与前面不同的地方在于,系统会把所有找过的目录都显示出来,如果文件或目录(加了/d参数)存在,则按实际找到的进行处理,否则显示成“目录路径\集合文本”格式的字符串。
所以,如果不加通配符的话,适合于找出所有目录,不过需要对结果再进行一定的处理。
另外与/d不同的是,在/r参数后可以指定要查找的路径,以空格隔开。
例子:for /r %%i in (你好) do echo %%i,执行结果(如果当前目录是D盘根目录的话):D:\你好、D:\soft\你好、等等,这样只要把每个后面的“你好”去掉,等同于把所有目录的路径列了出来,而且无论该目录树中是否存在“你好”皆如此。
因为其中没有通配符。
这里即便对结果用if exist 进行确认也没用。
for /r %%i in (你*) do echo %%i,执行结果:以“你”开头的文件名,无论在哪个子目录中的,都会显示出来。
如果没找到,则没有任何显示。
for /r c: %%i in (你*) do echo %%i,在C盘根目录中进行查找,不管当前目录是在哪里。
加上/d参数的用法相同,不再举例。
/L参数——序列,表明集合是一个序列。
这个序列的表示法是:(初值,步进,终值)。
如(1,2,11),产生序列(1,3,5,7,9,11)。
(11,-2,1)产生序列(11,9,7,5,3,1)。
/F参数——文件,这个参数功能最强大,也用得最多。
它可以把文件的内容放到集合元素中。
根据不同的情形,对集合的解释也不相同。
○1如果直接在括号中加入字符串,如(你好)、(你好朋友)等,都会被解释为文件名,这时系统会查找这个文件,如果存在,把文件内容分行作为集合的元素。
如果找不到,则提示文件不存在。
这个参数也可以处理字符串,而且功能更强大。
如果想把集合文本解释为字符串的话,用双引号括起来。
如"你好"、"你好朋友",这些都不会被解释为文件名,而是纯粹的字符串。
系统将根据是否有分隔符将其适当分解,然后作为集合的元素。
注意:不管分解成几个部分,默认情况下都只使用分解后的第1部分(若要处理其它部分,可使用下面的tokens选项)字符串作为一个集合元素,因此集合中也只有一个元素,即循环只执行一次。
当然一般纯字符串的情况根本无需由/f参数来处理。
非字符串的文件名及命令才是/f的主要处理对象。
在有的情况下,我们想执行一个命令,将命令的执行结果作为集合的元素。
这时,可将命令用英文半角的单引号括起来。
如列出当前目录下的所有文件及文件夹,并显示,应输入for /f %%i in ('dir /a') do echo %%i总结:可以根据是否有单引号、双引号,将集合解释为命令、字符串或文件名。