批处理命令行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语句可以在命令行提示符中使用,也可以在批处理文件中使用。
这两种情况下唯一的区别是%和%%,参加下文说明。
一、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总结:可以根据是否有单引号、双引号,将集合解释为命令、字符串或文件名。