CMD命令行高级教程精选合编第二章 DOS循环for命令详解.docx
- 文档编号:18088782
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:9
- 大小:20.46KB
CMD命令行高级教程精选合编第二章 DOS循环for命令详解.docx
《CMD命令行高级教程精选合编第二章 DOS循环for命令详解.docx》由会员分享,可在线阅读,更多相关《CMD命令行高级教程精选合编第二章 DOS循环for命令详解.docx(9页珍藏版)》请在冰点文库上搜索。
CMD命令行高级教程精选合编第二章DOS循环for命令详解
CMD命令行高级教程精选合编---第二章DOS循环:
for命令详解
第二章DOS循环:
for命令详解
讲FOR之前呢,咋先告诉各位新手朋友,如果你有什么命令不懂,直接在CMD下面输入:
name/?
这样的格式来看系统给出的帮助文件,比如for/?
就会把FOR命令的帮助全部显示出来!
当然许多菜鸟都看不懂....所以才会有那么多批处理文章!
!
!
!
俺也照顾菜鸟,把FOR命令用我自己的方式说明下!
正式开始:
一、基本格式
FOR%%variableIN(set)DOcommand[command-parameters]
%%variable 指定一个单一字母表示可替换的参数。
(set) 指定一个或一组文件。
可以使用通配符。
command指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
参数:
FOR有4个参数/d/l/r/f他们的作用我在下面用例子解释
现在开始讲每个参数的意思
二、参数/d
FOR/D%%variableIN(set)DOcommand[command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件
名匹配。
如果Set(也就是我上面写的"相关文件或命令")包含通配符(*和?
),将对与Set相匹配的每个目录(而不是指定目录中的文件组)执行指定的Command。
这个参数主要用于目录搜索,不会搜索文件,看这样的例子
@echooff
for/d%%iin(c:
\*)doecho%%i
pause
运行会把C盘根目录下的全部目录名字打印出来,而文件名字一个也不显示!
在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来
@echooff
for/d%%iin(?
?
?
)doecho%%i
pause
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了
这里解释下*号和?
号的作用,*号表示任意N个字符,而?
号只表示任意一个字符
知道作用了,给大家个思考题目!
@echooff
for/d%%iin(window?
)doecho%%i
pause
保存到C盘下执行,会显示什么呢?
自己看吧!
显示:
windows
/D参数只能显示当前目录下的目录名字,这个大家要注意!
三、参数/R
FOR/R[[drive:
]path]%%variableIN(set)DOcommand[command-parameters]
检查以[drive:
]path为根的目录树,指向每个目录中的
FOR语句。
如果在/R后没有指定目录,则使用当前
目录。
如果集仅为一个单点(.)字符,则枚举该目录树。
递归
上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?
放心他比/D强大多了!
他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子!
请注意2点:
1、set中的文件名如果含有通配符(?
或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
2、相反,如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录),而不管set中的指定文件是否存在。
这与前面所说的单点(.)枚举目录树是一个道理,单点代表当前目录,也可视为一个文件。
例:
@echooff
for/rc:
\%%iin(*.exe)doecho%%i
pause
咱们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!
!
!
!
例:
@echooff
for/r%%iin(*.exe)do@echo%%i
pause
参数不一样了吧!
这个命令前面没加那个C:
\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这个BAT你把他放在d:
\test目录下执行,那么他就会把D:
\test目录和他下面的子目录的全部EXE文件列出来!
!
!
例:
@echooff
for/rc:
\%%iin(boot.ini)doecho%%i
pause
运行本例发现枚举了c盘所有目录,为了只列举boot.ini存在的目录,可改成下面这样:
@echooff
for/rc:
\%%iin(boot.ini)doifexist%%iecho%%i
pause
用这条命令搜索文件真不错。
。
。
。
。
。
这个参数大家应该理解了吧!
还是满好玩的命令!
四、参数/L
FOR/L%%variableIN(start,step,end)DOcommand[command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
因此,(1,1,5)将产生序列12345,(5,-1,1)将产生
序列(54321)。
使用迭代变量设置起始值(Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值(End#)。
/L将通过对Start#与End#进行比较来执行迭代变量。
如果Start#小于End#,就会执行该命令。
如果迭代变量超过End#,则命令解释程序退出此循环。
还可以使用负的Step#以递减数值的方式逐步执行此范围内的值。
例如,(1,1,5)生成序列12345,而(5,-1,1)则生成序列(54321)。
语法是:
看着这说明有点晕吧!
咱们看例子就不晕了!
@echooff
for/l%%iin(1,1,5)do@echo%%i
pause
保存执行看效果,他会打印从12345 这样5个数字
(1,1,5)这个参数也就是表示从1开始每次加1直到5终止!
等会晕,就打印个数字有P用...好的满足大家,看这个例子
@echooff
for/l%%iin(1,1,5)dostartcmd
pause
执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!
如果把那个(1,1,5)改成(1,1,65535)会有什么结果,我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强!
当然我们也可以把那个startcmd改成md%%i这样就会建立指定个目录了!
!
!
名字为1-65535
看完这个被我赋予破坏性质的参数后,我们来看最后一个参数
五、参数/F
\迭代及文件解析
使用文件解析来处理命令输出、字符串及文件内容。
使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。
使用options令牌选项指定哪些令牌应该作为迭代变量传递。
请注意:
在没有使用令牌选项时,/F将只检查第一个令牌。
文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。
然后通过设置为令牌的迭代变量值,调用for循环。
默认情况下,/F传递每个文件每一行的第一个空白分隔符号。
跳过空行。
详细的帮助格式为:
FOR/F["options"]%%variableIN(file-set)DOcommand[command-parameters]
FOR/F["options"]%%variableIN("string")DOcommand[command-parameters]
FOR/F["options"]%%variableIN('command')DOcommand[command-parameters]
带引号的字符串"options"包括一个或多个
指定不同解析选项的关键字。
这些关键字为:
eol=c -指一个行注释字符的结尾(就一个)
skip=n -指在文件开始时忽略的行数。
delims=xxx -指分隔符集。
这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n -指每行的哪一个符号被传递到每个迭代
的for本身。
这会导致额外变量名称的分配。
m-n
格式为一个范围。
通过nth符号指定mth。
如果
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。
经测试,该参数最多
只能区分31个字段。
usebackq -使用后引号(键盘上数字1左面的那个键`)。
未使用参数usebackq时:
file-set表示文件,但不能含有空格
双引号表示字符串,即"string"
单引号表示执行命令,即'command'
使用参数usebackq时:
file-set和"file-set"都表示文件
当文件路径或名称中有空格时,就可以用双引号括起来
单引号表示字符串,即'string'
后引号表示命令执行,即`command`
以上是用for/?
命令获得的帮助信息,直接复制过来的。
晕惨了!
我这就举个例子帮助大家来理解这些参数!
For命令例1:
****************************************
@echooff
rem首先建立临时文件test.txt
echo;注释行,这是临时文件,用完删除>test.txt
echo11段12段13段14段15段16段>>test.txt
echo21段,22段,23段,24段,25段,26段>>test.txt
echo31段-32段-33段-34段-35段-36段>>test.txt
FOR/F"eol=;tokens=1,3*delims=,-"%%iin(test.txt)doecho%%i%%j%%k
Pause
Deltest.txt
运行显示结果:
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:
****************************************
@echooff
FOR/F"eol=delims="%%iin(test.txt)doecho%%i
Pause
运行将显示test.txt全部内容,包括注释行,不解释了哈。
For命令例3:
****************************************
另外/F参数还可以以输出命令的结果看这个例子
@echooff
FOR/F"delims="%%iin('netuser')do@echo%%i
pause
这样你本机全部帐号名字就出来了把扩号内的内容用两个单引号引起来就表示那个当命令执行,FOR会返回命令的每行结果,加那个"delims="是为了让我空格的行能整行显示出来,不加就只显示空格左边一列!
基本上讲完了FOR的基本用法了...如果你看过FOR的系统帮助,你会发现他下面还有一些特定义的变量,这些我先不讲.大家因该都累了吧!
你不累我累啊....
tokens和delims的应用
delims是指分割符,tokens是指选取分割后得到的字符串片断。
以下面这段代码为例:
FOR/F"eol=;tokens=2,3*delims=,"%iin("a,bc,def,ghij,jklmn")do@echo%i%j%k
其中Delims是“,”,所以"a,bc,def,ghij,klmn")被分隔成了abcdefghijklmn这5段。
tokens=2,3*表示取第2个片段、第3个片段以及第3个片段以后的所有片段,亦即:
%i=bc
%j=def
%k=ghij,klmn(此处“*”表示从第4个片段开始就不用再分割了,统统赋给%k)
所以如果你代码中用“tokens=*”的话,就表示不进行任何分割,直接把当前行赋给循环变量。
内容如下
helloworld
thankyouvery
youareverygood
这三行内容
for/f"tokens=*"%ain(a.txt)do@echo%a
helloworld
thankyouvery
youareverygood
"tokens=*"他可以变相的把每行前面的空格删除掉
for/f"delims="%ain(a.txt)do@echo%a
helloworld
thankyouvery
youareverygood
实例1:
kill.txt文件中保存着需要删除的文件名,每个文件名一行,有些文件名中有空格,用如下格式只能删除文件名中没有空格的文件,怎样才能删除文件名中有空格的文件?
或者怎样才能把有空格的整行数据赋予变量i,而不是只把第一列的值赋予变量i
错误:
For/f%%iin(kill.txt)DOdel %%i
这样不能删除带有空格文件名的文件.
正确:
For/F"delims=*"%%iin(kill.txt)DOdel "%%i"
FOR"usebackq"的应用
对于带有空格的文件名,您需要用双引号""将文件名括起来。
为了用这种方式来使
用双引号,您还需要使用usebackq选项,否则,双引号""会被理解成是用作定义某个要分析的字符串的。
例:
不能用:
for/f"tokens=*"%iin("ABC123.TXT")doecho%i(输出结果:
ABC123.TXT)
但上面结果并非我们意愿结果(即,要显示“ABC123.TXT”这个文件的每一行内容)。
因为for把括引ABC123.TXT的引号解释为括引一个字符串之用的引号了,所以for认为 "ABC123.TXT"是字符串,而不是文件名。
正确的是:
for/f"usebackqtokens=*"%iin("ABC123.TXT")doecho%i
当使用usebackq参数时,for正确解释了括引这个含有空格文件名的引号,也正常读取出了这个 含有空格文件名的文件内容了
要在用FOR中看到在直接CMD运行的内容用usebackq命令行要用倒引号``(左上角数字键1左边)
例:
for/f"usebackqdelims=="%%iin(`set`)do@echo%%i
for/f"delims=="%%iin('set')do@echo%%i
usebackq - 使用后引号(键盘上数字1左面的那个键`)。
未使用参数usebackq时:
file-set表示文件,但不能含有空格
双引号表示字符串,即"string"
单引号表示执行命令,即'command'
使用参数usebackq时:
file-set和"file-set"都表示文件
当文件路径或名称中有空格时,就可以用双引号括起来
单引号表示字符串,即'string'
后引号表示命令执行,即`command`
实例1:
用for来获取带空格的路径
错误:
FOR/F%%iIN('DIR"C:
\programfiles\WinRAR\*.exe"/s/b')doecho%%i
%%i只能获取c:
\program
正确:
FOR/F"usebackqtokens=3*delims=\"%%iIN(`DIR"C:
\programfiles\WinRAR\*.exe"/s/b`)doecho%%j
请注意这里用到usebackq圆括号里面要用后引号括起来,不是单引号括起来的,执行的是命令
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CMD命令行高级教程精选合编第二章 DOS循环for命令详解 CMD 命令行 高级 教程 精选 合编 第二 DOS 循环 for 命令 详解