FOR的语法
FOR是一个循环命令。所谓的循环指,对一组文件逐一运行一条命令,或对一组文件中的每一个文件执行某个特定命令。FOR常用于循环命令、遍历查询、解析文本等。
1、FOR的基本语法格式:
FOR /参数 %%I IN (Command1) DO Command2
FOR /参数 %%字母 IN (集合) DO 命令 [命令参数]
FOR /参数 %%Variable IN (Set) DO Command [Command-Parameters]
(注意:这三条命令的语法格式都一致,只是表示方式不同而已。一般情况下,本教程采用第一条表达,采用第二条讲解,采用第三条补充。)
2、用法:
一句话总结:从集合中依次逐一提取变量执行后面的命令。
FOR—IN—DO
这是FOR命令的基本结构,三个基本组成部分缺一不可。
FOR:
负责打开循环命令开关。
IN
负责从集合中抽取元素替换变量。它后面的括号不能省略。
DO
负责安排需要执行的命令和动作。它可以是一个命令如echo,也可以是一组命令如if exist。
/参数、%%I、(Command1)、Command2是它的动态组成部分,也是我们讲解的重点。
参数:
用来解释FOR,设置循环的模式。FOR常用的参数有/D、/F、/R、/L。
变量:
形式如%%I。集合中用来执行后面命令的任意一个可能的数值,需要执行命令的对象,一个替换位置。当它空缺时是变量,当FOR运行时它抽取集合里的数值替换自己,从而变成一个固定值。因此它来自集合,限于集合范围。
集合
范围、总量。是一个数据库,由固定数值组成,向变量提供固定数值,用于替换变量。变量和集合的关系是需求与供给的关系。集合的个数决定了需要循环的次数。集合要用括号括起来,不能缺少。
3、FOR的处理流程:
打开循环命令FOR。
第一步,从集合中抓取第一个数值A。用A替换形式变量%%I。用被A替换的%%I运行一次DO后面的命令Command2。
第二步、从集合中抓取第二个数值B。用B替换形式变量%%I。用被B替换的%%I运行一次DO后面的命令Command2。
第三步、从集合中抓取第三个数值C。用C替换%%I。用被C替换的%%I执行DO后面的命令。
…………
“抓取-替换-执行命令”机器根据命令不停地从集合中抓取数值替换变量执行后面的命令。一次只处理一个数值,依次循环下去,直至集合中的数值全部被处理过。
这就是FOR命令的奥秘所在:逐个抓取,依次完成。
三、实战应用
理论的东西太过抽象,我们用事例来解释。回头看看前面的故事,李四如何用那串钥匙开锁?
1、钥匙的启示
可能很多人一下子就想到了,既然钥匙在手中,何不一个一个的试,看哪个能打开。钥匙有一大串,而门锁
只有一个孔,所以,一次你只能试一根钥匙。一根一根的试,直到找到那根能够打开锁的钥匙。
FOR的工作原理类似于此。
集合(Command1)相当于钥匙串,它由许多个数值(钥匙)组成。变量%%I就是尝试开门锁的那根钥匙,它是从钥匙串里抓取出来的,不特指哪根。DO+命令就是尝试开门锁。
FOR每次从集合(钥匙串)中抓取一个数值(一根钥匙),然后用这个数值执行DO后面的命令(尝试开锁)。FOR不是一次就同时抓取集合里的所有数值(所有钥匙),而是逐个的抓取,逐个的执行,直至轮完所有的数值(钥匙)。
钥匙要一个一个的试,数值也是要一个一个的轮。一次一个,轮流完成。
2、我爱北京天安门
为了加深理解,再看一个具体的例子。
@echo off
for %%I in (我爱北京天安门) do echo %%I
pause>nul
运行结果是显示:
我爱北京天安门
修改一下,用点号把“我爱北京天安门”分成三段:
@echo off
for %%I in (我爱,北京,天安门) do echo %%I
pause>nul
结果显示:
我爱
北京
天安门
对比一下结果,修改前的显示结果是一行完整的句子,而修改后的显示结果变成了三行。为什么会这样呢?
这要从FOR命令的运行过程说起:
FOR命令要从“我爱北京天安门”这个句子里抽取IN一个字词作为变量%%I并显示echo到屏幕上,它必须先区分和计算这个集合(Command1)“我爱北京天安门”有多少个变量,区分的方法通常是用点号和空格来隔开每个字词。上例用两个点号将“我爱北京天安门”分割成三段:“我爱”、“北京”、“天安门”。
FOR命令执行时,它并非一次性将“我爱”、“北京”、“天安门”三个变量同时全部抓出来echo到屏幕上,而是按照先后顺序逐个抓取。
它首先抓取IN排在第一位的“我爱”作为形式变量%%I,然后做DO下一步动作,显示echo到屏幕上。因此,“我爱”成了独立的第一行。
接着,FOR抓取括号里的第二个元素“北京”作为形式变量显示到屏幕上,“北京”成为第二行。
第三步,FOR抓取“天安门”显示到屏幕上成为第三行。
FOR命令就这样一次一个的、按顺序的从括号里(Command1)抓取元素作为形式变量%%I,然后显示到屏幕上,从第一个轮流循环到最后一个。
4、手枪
如果把弹夹当作一个集合,子弹当作集合里的元素,枪膛弹槽就是变量,动作命令就是扣动扳机,撞针在弹簧的作用下撞击子弹,从而把子弹发射出枪膛。手枪枪膛的弹槽和撞针只有一个,决定了它一次只能打出去一颗子弹,它不能一次同时打出去两颗子弹。
打手枪的过程很好的解释了FOR命令执行的过程,FOR
命令也一样。它一次只能从集合里抽取一个数值来执行后面的命令,而不能同时抽取两个。
FOR不能一次同时全部执行所有集合中的任务,它总是分批、分次的执行。时间是一次、数量是一个,方式是依次。本节不厌其烦、不辞辛苦的举证、讲解的目的就是让大家明白,FOR命令无论有多复杂它都遵循这条最基本的准则,理解了这点你才能理解FOR命令,在以后FOR的学习运用中左右逢源、得心应手。
5、练习:
1、请默写出FOR命令的语法格式。
2、请向你的身边的朋友说说FOR命令的运行过程。
3、请尝试编写一个用FOR显示“l love you!”的批处理。
第二节 FOR的集合与变量
本节将FOR的“集合”和“变量”放在一起的原因是,两者之间存在着相互关系。
集合向变量提供元素替换变量,因此是供应者,它决定了变量的取值范围。用术语说,集合赋值给形式变量。
变量为集合内的元素提供赋值位置,它只能从集合限定的范围取值,因此是需求者。
集合赋值给变量,变量又向DO命令赋值,这个过程构成一个FOR的循环。集合内元素的总量决定了FOR循环的次数。
二、集合
(一)概述
FOR命令常见的三种表达方式:IN (Command1)、 IN (集合)、 IN (Set)。
集合,也称集。在批处理里,它确定一个范围、总量,是一个数据库,由固定数值(元素)组成,向变量提供固定数值,用于替换变量。变量和集合的关系是需求与供给的关系。集合的个数决定了需要循环的次数。
集合必须用圆括号括起来。
集合里的内容包罗万象。可以是单个字符,也可以是字符串,可以是文件,也可以是命令。我们见得最多有:
路径+文件名:如c:\note.txt
文本:如歌曲列表.txt
字词:如我爱北京天安门
数字:如123
符号:如+、-、*、\
命令:如’set’
盘符:如c:\
还有时间、进程、注册表、服务、内存管理、启动等等。
集合里可以是只有一个元素(数值),如:“我爱北京天安门”
也可以有多个,如:“c: d: e: f:”
甚至所有、全部,如:*.*
可以确指,如“我爱北京天安门”
也可以是模糊的,如:w?s.*
(二)FOR与文件查询
由于FOR也可以用来查询文件,FOR结合通配符查询文件的功能要比DIR强得多,因此有必要结合通配符来谈谈FOR命令。
通配符(?和*)常用来代替未具体指明的文件和数据。
?代表单个字符。
* 代表全部字符。
将通配符用于集合内,FOR可以展现强大的搜索能力。
1、查询当前目录(批处理命令所在的位置)的所有文件:
@echo off
for %%i in (*.*) do echo "%%i"
pause
讲解:
*.*的第一个星
号表示文件名,第二个星号表示扩展名,整体表示所有类型的文件。
2、列举当前目录下所有扩展名为txt的文件:
@echo off
for %%i in (*.txt) do echo "%%i"
pause
讲解:
*.txt表示所有扩展名为txt的文件,也就是所有文档(记事本)文件了。
3、查询txt和doc两种类型的文档:
@echo off
for %%i in (*.doc *.txt) do echo "%%i"
pause
讲解:
集合里包含两个元素*.doc和*.txt,两者之间六个空格。*.doc是所有WORD文档。
4、查询文件名只有两个字符的文档:
@echo off
for %%i in (??.txt) do echo %%i
pause
讲解:
??表示两个字符,也就是文件名只有两个字母或两个汉字了的文档。
5、查询文件名第二个字母为O的mp3文件:
@echo off
for %%i in (?o*.mp3) do echo %%i
pause
讲解:
?和o存在先后顺序,?是第一个字符,o是第二个字符,*代表剩余的字符。
6、查询以F开头的文件:
@echo off
for %%i in (F*.*) do echo %%i
pause
讲解:
F*.*T表示文件名以“F”开头,扩展名以“T”结尾的文件。
7、查询含有字母F的文件:
@echo off
for %%i in (*F*) do echo %%i
pause
讲解:
文件名含有字母“F”,但不包括文件夹在内。
8、查询C盘下的所有文件,不包括子目录:
@echo off
for %%i in (c:\*) do echo %%i
pause
9、查询C盘下的所有文件,包括子目录:
@echo off
For /r c:\ %%i in (*) do echo %%i
Pause
10、查询C盘下的所有文件夹,包括子目录:
@echo off
For /r c:\ %%i in (.) do echo %%i
Pause
讲解:
如果集合只是一个句点 (.),则只枚举目录树。
似乎除了*,使用其他字符搜索到的都是目录,但文件夹后面都跟了一个点号。
11、全盘搜索文件desktop.ini:
@echo off
FOR %%a IN (C: D: E: F:) DO cd /d %%a & for /r %%b in (desktop.ini) do if exist %%b echo %%b
pause
注意:
凡是涉及D盘的都搜索不出来,而我的大部分exe都放在D盘,D盘又没设保护,为什么?
涉及长文件名,中间有空格亦无法start。如:C:\Program Files,如何解决?
12、搜索F盘mp3文件:
@echo off
for /r f:\ %%i in (*.mp3) do echo %%i>>music.txt
pause>nul
讲解:
将搜索到的mp3文件保存到music.txt文档中。
(三)常见的集合类型
1、 集合内的文字字符串(string)
例:我爱北京天安门
for %%I in (我爱北京天安门) do echo %%I
2、集合内的文件名(filename-set)
例:静夜思.txt
for /f %%i in (静夜思.txt) do echo %%i
3、集合内的命令(command)
例:二次过滤:
for /f "eol=;" %%a in ('for /f "eol=S" %%b in ^(a.txt^)do @echo %%b') do echo %%a
4、集合内的变量(%var%)
例:自动关机:
set times=
set /p times=请输
入关机时间:
:: 以下语句实现每个星期的每一天指定时间关机
:: 如果要换成每个月的某几天,请改字母为数字,并用逗号分隔
:: 以下代码没有错误检测语句,输入时间的时候务必按照指定格式输入
:: 可以用在CMD窗口用at命令来查看计划任务
if not "%times%"=="" for %%i in (%times%) do (
at %%i /every:M,T,W,Th,F,S,Su shutdown -s
)
二、变量的用法
(一)概述
1、FOR命令必须使用变量,且变量的格式是两个百分号紧挨一个字母,如:%%a。
同一个FOR命令内,变量后面的字母之间存在先后顺序。一般情况下,使用了%%a做变量,再增加个变量的话就应该是%%b、%%c,依此类推。
变量要区分大小写,%%A是不同于%%a的。
2、
3、变量的固值化。
这段是废话,可免读。
前面提到过,变量其实是一个虚拟的位置,该位置是想DO提供命令执行对象的。同时它也向集合提供跳板,集合里的元素要出来执行DO后面的命令,它就要替换外面的变量,用变量做跳板执行DO。说白了,其实是变量借了集合的名,变量本身没有任何实质东西,真正执行DO的是集合里的元素,而非变量本身。
为什么不跳过变量这一关直接用集合内的元素执行DO?这个问题比较深奥,这里不做讨论。这涉及到变量的存在设计,最好去问工程师。
用前面的“钥匙的启示”来说,钥匙串提供钥匙,门锁提供锁孔,两者缺一不可,两者合作才能做开锁的动作。 变量的固值化说白了就是取出一个钥匙插入锁孔内。理论上讲就是变量被集合内的元素替换的过程。如果变量不替换成集合捏的元素,变量就是一个空壳,空壳无法完成DO命令。而集合内的元素如果没有变量提供的位置,它就毫无立足之地。
4、输入变量与输出变量
简单讲,DO前面的变量是输入变量,DO后面的变量是输出变量。
比如:
for %%i in (.) do echo %%i
第一个%%i是输入变量,第二个%%i是输出变量。
做个形象的比喻:集合是一个劳务输出大国,它输出劳动力给FOR公司,FOR公司提供就业岗位%%i,该劳动岗位的工作DO就是command2。从FOR公司角度来看,提供就业岗位就是输入变量——吸收人才,参加工作就是输出变量——创造业绩。
二)扩充变量
扩充变量可以增强FOR 命令,以下是拷贝官方的帮助文件,稍作补充。
FOR 变量参照的替换已被增强。您现在可以使用下列选项语法:
~I - 删除任何引号("),扩充 %I
%%~fI - 将 %I 扩充到一个完全合格的路径名(完整路径名)
%%~dI - 仅将 %I 扩充到一个驱动器号(只显示盘符)
%%~pI - 仅将 %I 扩充到一个路径(只提取路径)
%%~nI - 仅
将 %I 扩充到一个文件名(只提取文件名)
%%~xI - 仅将 %I 扩充到一个文件扩展名(只提取后缀格式)
%%~sI - 扩充的路径只含有短名(过长的文件名将被缩减)
%%~aI - 将 %I 扩充到文件的文件属性(a只读,h隐藏)
%%~tI - 将 %I 扩充到文件的日期/时间(创建修改时间)
%%~zI - 将 %I 扩充到文件的大小(kb)
%%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串。
可以组合修饰符来得到多重结果:
%%~dpI - 仅将 %I 扩充到一个驱动器号和路径
%%~nxI - 仅将 %I 扩充到一个文件名和扩展名
%%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
%%~dp$PATH:i - 查找列在路径环境变量的目录,并将%I 扩充到找到的第一个驱动器号和路径。
%%~ftzaI - 将 %I 扩充到类似输出线路的 DIR
在以上例子中,%%I 和 PATH 可用其他有效数值代替。%%~ 语法用一个有效的 FOR 变量名终止。选取类似 %%I 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I。同时不能有 52 个以上都在使用中。
很多人都搞不懂有关FOR命令的官方帮助文件,因为翻译实在太不近人情了。此处你只要抓住以上十一个扩充变量的用法就可以了,具体作用等你用到了再查吧。
1、选项~I的用法
例:注意观察双引号。
创建文本“删除引号.txt”:
“你贵姓”
“偶姓‘朱’,名‘立业’,‘朱立业’”
“猪立叶?”
“嗯!”
“今年多大了?”
“16。”
"2009年1月15日"
ba"____"ch
"1+1"="?"
‘2’
代码:
@echo off
FOR /F "delims=" %%i IN (删除引号.txt) DO echo %%~i
pause
运行结果:
1)中文状态的双引号一个都没消失。证明其对中文状态双引号不起作用。如“16。”
2)英文状态的双引号最外围的被删除(帘危┝恕5 屑涞幕乖凇H?/span>"1+1"="?"
3)英文状态的单引号没有被删除。如‘2’
讲解:
该命令适合于从其他地方提取字符串,并将字符串中最外围的双引号删除,以便用于做其他命令。看下例:
@echo off
for %%a in ("伟大的中国人民万岁 万岁 万万岁") do echo.%%~a
pause>nul
运行结果:
伟大的中国人民万岁 万岁 万万岁
讲解:
如果不使用双引号将分段显示。使用中文状态的双引号显示结果带有双引号。但使用英文状态的双引号(””)结果显示则很干净。
2、其他选项的用法
例:只查看文件名:
@echo off
for %%i in (*.*) do echo %%~ni
pause>nul
讲解:
%%~ni能够提取文件名,用此命令来提取你电脑里的歌曲名称将是最好的选择。
例:
查看日期大小文件名:
@echo off
for %%i in (*.*) do echo %%~ztni
pause>nul
讲解:
有时候,你想查看文件的日期、大小、属性等,可以组合使用扩充变量。这个在杀毒时或许用得上。
扩充变量虽然多,但用法基本一致,只需用其他扩充变量替换%%~ni即可体验它们的功效,这里不再一一赘述。
注意扩充变量最后的字母I,它并非固定的,输入变量是什么它就该是什么。
比如使用%%~$PATH:I:
@echo off
for /r %%a in (*.*) do echo %%~$PATH:a
pause>nul
讲解:
第一个%%a使用了a,那么第二个%%a还是用a,并不因为增加了扩充变量~$PATH:而改变。不能生套硬搬公式一律用I。
扩充环境变量常用来提取一些关键字符,或排除其他一些多余因素。
(三)系统变量
(暂时省略)
第三节 FOR的DO
一、概述
DO后面跟一个或一组命令。表示每一次FOR循环需要执行的命令。
有时候,DO后面的命令过于复杂,需要用括号括起来表示一个整体。
二、类型
1、一个命令:
for %%i in (?o*.mp3) do echo %%i
2、一组命令:
for /r d: %%i in (QQ.exe) do if exist %%i start %%i
1、 需要括号:
@echo off
color 0A
for /l %%a in (1,2,8) do (
for /l %%b in (3,3,18) do (
for /l %%c in (100,-15,30) do (
echo %%a %%b %%c
)
)
)
pause
三、运用
(省略,请看第五节《FOR命令的综合应用》)
第四节 FOR的参数
FOR常见的参数有/D、/R、/F、/L。内容比较多,需要逐一消化。
课时建议:
参数/D、/R与/L用一课时;参数/F用四课时,其中eol=和skip=用一课时,delims=、tokens=和usebackq各用一课时。下面逐一讲解。
一、/D参数——查询目录
格式:
FOR /D %%I IN (Command1) DO Command2
用法:
一句话总结:/D用于搜索目录(或文件夹)。
注意:
只搜索文件夹,不搜索文件。只搜索指定目录,不搜索子目录。
例211:搜索C盘下的所有目录:
@echo off
for /d %%i in (c:\*) do echo %%i
pause
运行结果是显示C盘下所有的文件夹名字,但不包含子目录。
例212:搜索当前目录中的文件夹:
@echo off
for /d %%i in (*) do echo %%i
pause
运行结果是显示批处理所在目录下的所有文件夹。
练习:
1、请比较查询命令DIR与FOR /D。
2、请编写一个只搜索文件名而不搜索文件夹名的批处理。
二、/R参数——遍历搜索
格式:
FOR /R %%I IN (Com
mand1) DO Command2
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
注意:
/R后可以指定路径[[drive:]path]。
用法:
一句话总结:遍历所有地址搜索文件。
包括搜索所有子目录。比/D搜索的范围要大。遍历?递归?全部,每个角落。
通常,/D只搜索当前目录或者指定目录,而不深入子目录。
而/R搜索的范围从当前目录或指定目录开始,深入所有子目录。无孔不入,大有活要见人死要见尸掘地三尺也要把你找出来的气势。
例221:搜索当前目录下的所有文件。
@echo off
for /r %%i in (*) do echo %%i
pause
运行结果将显示,当前目录下的所有文件以及该目录下所有子目录里的所有文件。
例222:搜索C盘里所有的扩展名为exe的文件。
@echo off
for /r c:\ %%i in (*.exe) do echo %%i
pause
运行结果将显示C盘和C盘里各个文件夹下的exe文件。杀毒很有用哦。
例:搜索C盘千千静听播放器:
@echo off
for /r c:\ %%i in (ttplayer.exe) do if exist %%i start %%i
pause
运行结果将打开千千静听,前提是你的千千静听装在C盘。使用if exist的目的是避免文件不存在时不断的提示错误。
检查了一下,无法读出长文件名,思考中。如果你的千千静听默认安装在C盘,更简单的方法是:
start %Progra~1%\ttplayer\ttplayer.exe
讲解:
一句命令就足够了,效率啊!我的在D盘都找出来了!
用到环境变量的内容。不支持长文件名所以使用了%Progra~1%代替Program Files。
例223:搜索F盘里所有目录。
@echo off
for /r f:\ %%i in (.) do echo %%i
pause
运行结果将显示F盘以及F盘下所有的文件夹。显示结果后面都带有一个点号不懂如何消除,一直在思考一个完美的方式,请诸位指点。
练习:
1、请说说FOR /R的作用。
2、请比较参数/D和/R。
3、请编写一个全盘搜索QQ.exe的批处理。
4、请编写一个搜索C盘里所有名字带“SYS”的文件夹的批处理。
三、/L 参数——序列
格式:
FOR /R %%I IN (Command1) DO Command2
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
用法:
一句话总结:给指定对象建立序列。
/L参数是以增量形式从开始到结束的一个数字序列的迭代数值范围。
使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。
/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。
用FOR给1到5这几个数字排一下顺序。
例:递增方式
。
@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
运行结果是生成序列:1 2 3 4 5。
例:递减方式。
@echo off
for /l %%i in (1,-1,5) do @echo %%i
pause
运行结果是生成序列:5 4 3 2 1。
注意:
集合(start,step,end)中,start表示序列的起始值,end表示序列的结束值,两者共同决定了序列的取值范围。
step控制着start和end的生成方式。当step为正时是递增序列,当step为负时是递减序列。如果step=0则循环下去?
例:start,step,end三者的数值关系。
@echo off
for /l %%i in (2,2,13) do echo %%i
pause>nul
运行结果分行显示2、4、6、8、10、12
讲解:
start,step,end三者的数值关系是:
start > end
当step为正时,start+step决定%%i的最小取值范围,end决定%%i的最大取值范围。
当step为负时,start+step决定%%i的最大取值范围,end决定%%i的最小取值范围。
例:创建三个以数字1、2、3命名的文件夹。
@echo off
for /l %%i in (1,1,3) do md %%i
exit>nul
运行结果将在当前目录下创建三个以数字命名的文件夹。
讲解:“毒虫”们一看见该命令无比兴奋,如果把(1,1,3)里面的3改成九位数的3那岂不是……
个人不是很熟悉,但看人家写的作品时倒是经常出现这个/l。请看第五节第三个案例《神奇读心术》。
练习:
1、请用所学的批处理知识说说(a,-1,z)的意思。
2、请编写一个打开十个IE浏览器窗口的批处理。
3、请编写一个可以名字是随机数字扩展名为.exe的批处理。
四、/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=、skip=、delims=、tokens=和usebackq。后面将逐个讲解。
先创建一个文本文件a.txt,内容如下:
::我的测试
aaa,bbb,ccc,ddd
iii jjj kkk lll
eee,fff,ggg,hhh
你好,甲兵,考试,吃饭
将本内容保存好,后面内容都要用到该文本做试验。
(一) eol=c 忽略以某字符开头的行
格式:
FOR /F "eol=c" %%I IN (Command1) DO Command2
用法:
eol=c
一句话总结:表示忽略(隐藏、屏蔽)开头字符是C的行。
“指定行尾字符(仅一个字符)。”这是帮助文件里的话,目前不理解它的用法。
Eol=
默认情况下屏蔽冒号开头的行
如果C是文本某行开头
第一个字符,即“eol=a”,它将在屏幕上屏蔽掉以a开头的行。
例如:文本“静夜思.txt”的内容是:
床前明月光,
疑是地上霜;
举头望明月,
低头思故乡。
如何忽略掉文本文件a.txt中的第三行:“举头望明月,”?
@echo off
for /f "eol=举" %%i in (静夜思.txt) do echo %%i
pause>nul
运行结果将隐藏第三行。
注意:
如果忽略的字符串的开头是重复字符,则EOL后只需截取一个字符。
如要“aaa”,“eol=”后只需一个“a”就可以了。同样,双冒号“::”只取一个。
练习:
请用skip屏蔽掉文本“a.txt”中的第四行,即隐藏行“eee,fff,ggg,hhh”。
拓展思考:如何文本中的最后一行?
(二)skip=n 忽略前N行
格式:
FOR /F "skip=n" %%I IN (Command1) DO Command2
用法:
一句话总结:忽略文本开头的前N行。
skip=n表示忽略(屏蔽、隐藏)从第一行到第N行的内容。(n>0)
例:忽略文本a的前四行。
@echo off
for /f "skip=4" %%i in (a.txt) do echo %%i
pause>nul
运行结果将只显示第五行。
练习:
忽略掉文本“a.txt”中的第一行有几种方法?
拓展思考:如何单纯屏蔽第五行?