批处理-----3.for循环详解
批处理-----3.for循环详解
讲FOR之前呢,咋先告诉各位新⼿朋友,如果你有什么命令不懂,直接在CMD下⾯输⼊:
name /? 这样的格式来看系统给出的帮助⽂件,⽐如for /? 就会把FOR命令的帮助全部显⽰出来!当然许多菜鸟都看不懂....所以才会有那么多批处理⽂章俺也照顾菜鸟,把FOR命令⽤我⾃⼰的⽅式说明下!
正式开始:
⼀、基本格式
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定⼀个单⼀字母表⽰可替换的参数。
(set) 指定⼀个或⼀组⽂件。可以使⽤通配符。
command 指定对每个⽂件执⾏的命令。
command-parameters
为特定命令指定参数或命令⾏开关。
参数:FOR有4个参数 /d /l /r /f 他们的作⽤我在下⾯⽤例⼦解释
现在开始讲每个参数的意思
⼆、参数 /d
FOR /D %%variable IN (set) DO command [command-parameters]
情人节要送什么礼物
如果集中包含通配符,则指定与⽬录名匹配,⽽不与⽂件
名匹配。
如果 Set (也就是我上⾯写的 "相关⽂件或命令") 包含通配符(* 和 ?),将对与 Set 相匹配的每个⽬录(⽽不是指定⽬录中的⽂件组)执⾏指定的 Command。
这个参数主要⽤于⽬录搜索,不会搜索⽂件,看这样的例⼦
@echo off
for /d %%i in (c:\*) do echo %%i
pause
运⾏会把C盘根⽬录下的全部⽬录名字打印出来,⽽⽂件名字⼀个也不显⽰!
在来⼀个,⽐如我们要把当前路径下⽂件夹的名字只有1-3个字母的打出来
@echo off
for /d %%i in () do echo %%i
pause
这样的话如果你当前⽬录下有⽬录名字只有1-3个字母的,就会显⽰出来,没有就不显⽰了
这⾥解释下*号和?号的作⽤,*号表⽰任意N个字符,⽽?号只表⽰任意⼀个字符
知道作⽤了,给⼤家个思考题⽬!
@echo off
for /d %%i in (window?) do echo %%i
pause
保存到C盘下执⾏,会显⽰什么呢?⾃⼰看吧! 显⽰:windows
/D参数只能显⽰当前⽬录下的⽬录名字,这个⼤家要注意!
三、参数 /R
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的⽬录树,指向每个⽬录中的
FOR 语句。如果在 /R 后没有指定⽬录,则使⽤当前
⽬录。如果集仅为⼀个单点(.)字符,则枚举该⽬录树。
递归
上⾯我们知道,/D只能显⽰当前路径下的⽬录名字,那么现在这个/R也是和⽬录有关,他能⼲嘛呢?放⼼他⽐/D强⼤多了!
他可以把当前或者你指定路径下的⽂件名字全部读取,注意是⽂件名字,有什么⽤看例⼦!
请注意2点:
1、set中的⽂件名如果含有通配符(?或*),则列举/R参数指定的⽬录及其下⾯的所⽤⼦⽬录中与set相符合的所有⽂件,⽆相符⽂件的⽬录则不列举。
2、相反,如果set中为具体⽂件名,不含通配符,则枚举该⽬录树(即列举该⽬录及其下⾯的所有⼦⽬录),⽽不管set中的指定⽂件是否存在。这与前⾯所说的单点(.)枚举⽬录树是⼀个道理,单点代表当前⽬录,也可视为⼀个⽂件。
例:
@echo off
for /r c:\ %%i in (*.exe) do echo %%i
pause
咱们把这个BAT保存到D盘随便哪⾥然后执⾏,我会就会看到,他把C盘根⽬录,和每个⽬录的⼦⽬录下⾯全部的EXE⽂件都列出来了
例:
@echo off叕怎么读
for /r %%i in (*.exe) do @echo %%i
pause
参数不⼀样了吧!这个命令前⾯没加那个C:\也就是搜索路径,这样他就会以当前⽬录为搜索路径,⽐如你这个BAT你把他放在d:\test⽬录下执⾏,那么他就会把D:\test⽬录和他下⾯的⼦⽬录的全部EXE⽂件列出来
例:
@echo off
for /r c:\ %%i in (boot.ini) do echo %%i
pause
运⾏本例发现枚举了c盘所有⽬录,为了只列举boot.ini存在的⽬录,可改成下⾯这样:
奇迹圣导师加点@echo off
for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i
pause
⽤这条命令搜索⽂件真不错。。。。。。
这个参数⼤家应该理解了吧!还是满好玩的命令!
四、参数 /L
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
该集表⽰以增量形式从开始到结束的⼀个数字序列。
因此,(1,1,5) 将产⽣序列 1 2 3 4 5,(5,-1,1) 将产⽣
2020高考志愿填报
序列 (5 4 3 2 1)。
使⽤迭代变量设置起始值 (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)。语法是:
看着这说明有点晕吧!咱们看例⼦就不晕了!
@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
保存执⾏看效果,他会打印从1 2 3 4 5 这样5个数字
(1,1,5)这个参数也就是表⽰从1开始每次加1直到5终⽌!
等会晕,就打印个数字有P⽤...好的满⾜⼤家,看这个例⼦
@echo off
for /l %%i in (1,1,5) do start cmd
pause
执⾏后是不是吓了⼀跳,怎么多了5个CMD窗⼝,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,我先告诉⼤家,会打开65535个CMD窗⼝....这么多你不死机算你强!
当然我们也可以把那个start cmd改成md %%i 这样就会建⽴指定个⽬录了名字为1-65535
看完这个被我赋予破坏性质的参数后,我们来看最后⼀个参数
五、参数 /F
\迭代及⽂件解析
使⽤⽂件解析来处理命令输出、字符串及⽂件内容。使⽤迭代变量定义要检查的内容或字符串,并使⽤各种options选项进⼀步修改解析⽅式。使⽤options令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使⽤令牌选项时,/F 将只检查第⼀个令牌。
⽂件解析过程包括读取输出、字符串或⽂件内容,将其分成独⽴的⽂本⾏以及再将每⾏解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调⽤ for 循环。默认情况下,/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"包括⼀个或多个
指定不同解析选项的关键字。这些关键字为:
eol=c - 指⼀个⾏注释字符的结尾(就⼀个)(备注:默认以使⽤;号为⾏⾸字符的为注释⾏)
skip=n - 指在⽂件开始时忽略的⾏数,(备注:最⼩为1,n可以⼤于⽂件的总⾏数,默认为1。)
好看的异界小说
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n - 指每⾏的哪⼀个符号被传递到每个迭代
的 for 本⾝。这会导致额外变量名称的分配。m-n
格式为⼀个范围。通过 nth 符号指定 mth。如果
符号字符串中的最后⼀个字符星号,
那么额外的变量将在最后⼀个符号解析之后
分配并接受⾏的保留⽂本。经测试,该参数最多
只能区分31个字段。(备注:默认为1,则表⽰只显⽰分割后的第⼀列的内容,最⼤是31,超过最⼤则⽆法表⽰) usebackq - 使⽤后引号(键盘上数字1左⾯的那个键`)。
未使⽤参数usebackq时:file-set表⽰⽂件,但不能含有空格
双引号表⽰字符串,即"string"
单引号表⽰执⾏命令,即'command'
使⽤参数usebackq时:file-set和"file-set"都表⽰⽂件
当⽂件路径或名称中有空格时,就可以⽤双引号括起来
单引号表⽰字符串,即'string'
后引号表⽰命令执⾏,即`command`
以上是⽤for /?命令获得的帮助信息,直接复制过来的,括号中的备注为我添加的说明。
晕惨了!我这就举个例⼦帮助⼤家来理解这些参数!
For命令例1:****************************************
1 2 3 4 5 6 7 8 9@echo off
rem ⾸先建⽴临时⽂件
echo;注释⾏,这是临时⽂件,⽤完删除 &
echo11段 12段 13段 14段 15段 16段 >&
echo21段,22段,23段,24段,25段,26段 >&
echo31段-32段-33段-34段-35段-36段 >&
FOR /F "eol=; tokens=1,3* delims=,- "%%i in () do echo%%i %%j %%k Pause
运⾏显⽰结果:
11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
请按任意键继续. . .
为什么会这样?我来解释:
eol=; 分号开头的⾏为注释⾏
tokens=1,3* 将每⾏第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k delims=,- (减号后有⼀空格)以逗号减号和空格为分隔符,空格必须放在最后For命令例2:****************************************
1 2 3@echo off
FOR /F "eol= delims="%%i in () do echo%%i Pause
运⾏将显⽰全部内容,包括注释⾏,不解释了哈。For命令例3:****************************************
另外/F参数还可以以输出命令的结果看这个例⼦
1 2 3@echo off
FOR /F "delims="%%i in ('net user') do @echo%%i pause
这样你本机全部帐号名字就出来了把扩号内的内容⽤两个单引号引起来就表⽰那个当命令执⾏,FOR会返回命令的每⾏结果,加那个"delims="是为了让我空格的⾏能整⾏显⽰出来,不加就只显⽰空格左边⼀列!公司人事管理制度

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。