for命令是通过循环执行一系列对象的一个或多个命令,在命令行或批处理中运行的命令。结合Windows管理中的一些程序,其处理功能强大,应用的灵活性和便捷性令人印象深刻。
for命令是在命令行或批处理中运行的命令,通过依次对一系列对象循环执行一个或多个命令来实现。结合Windows管理中的一些程序,其处理功能强大,应用的灵活性和便捷性令人印象深刻。但是,它的帮助信息非常复杂,常常让初学者望而生畏。在这里,根据我的学习和理解,有必要对其用法进行分解和简化,疏忽和错误可能在所难免。
基本格式
(这是命令行中使用的格式。如果是批量处理,需要在表单%%)上加%:
(set) do命令中的/parameter%变量
(注:除中文外,其余均按其格式要求编写,大小写皆可。)
参数:FOR分为四个参数,D L R F,有些参数可以附加其他选项,下面会单独介绍。
变量:(记住,如果在批处理中使用for命令,变量前的%需要改为%%。)这个变量名由单个字母组成,区分大小写(原来的帮助是这么说的,但实际中用单个数字作为变量名也是可行的)。例如,%b和% b代表不同的变量。
在每个循环中,FOR命令将in (set)中读取的值赋给该变量,以便在后续命令中引用。
Set:由命令(通配符*?也可以参考环境变量)。FOR命令是按照一定的顺序和规律读取集中的内容,给变量赋值,do后执行命令,进行下一个循环,直到集中的内容已经读取完,格式上需要括号(in和后括号之间要有空格)。
命令:可以是任何符合条件的DOS命令,也可以是DOS可以调用的外部程序,多个命令可以用括号括起来,在一个周期内执行。
注意:由于某些目录或文件名可能有空格,很多时候set和commands往往需要用英文引号括起来(但有时引号中的内容可能被视为字符串)来表示一个整体。为了简单起见,下面的一些例子忽略了文件名或目录名有空格的情况。
现在根据参数分类举例说明其用法:
一、参数 /d
(set) do命令中的/d %%变量
/d参数是一个for命令,它指定只执行目录,而不执行文件。
示例1:
在命令行输入(不在批处理中,后面不解释)
(c:*中的/d %a。*)做回显%a
运行几次会显示c盘根目录下的所有目录,而不是显示文件名。
看起来有点乱。如果您回显命令提示符来关闭,就会很清楚:
(c:*中的/d %a。*) do @echo %a
二、参数 /R
/R参数后面可以跟一个驱动器号和一个路径。
For /r在(set) do命令中可以有path% variable。
/r后面的路径是指其下整个目录树(相当于DOS命令树中的范围)中的所有目录。如果只是英文句点,则指当前路径下的目录树。如果省略path,则引用当前目录,后续的in (set)相当于与之前每个目录匹配的文件集。
这里根据IN (set)中是否有通配符分两种情况。
1)in(集合)中没有通配符
指定的是单个文件或枚举的特定文件(多个文件名用分隔符分隔,如空格、逗号等。)
示例2
@的回声
for /r . %i in (abc.txt) do echo。%i
回声
注意:这里for /r后面只有一条路径,和echo。每个后续循环中的%i相当于创建一个只有一个空行的文本文件。总体效果是在当前目录中包含子目录,并在每个目录中创建一个abc.txt。
实施例3(投入批量处理)
@关闭回声
Rem显示D: disk中所有文件名file1和file2的列表。
for /r d: %%h in (file1,file2) do if exist %%h echo %%h
中止
2) in (set)包含通配符*或?
这种类型的do命令将处理在先前的/r中指定的包含in (set)中的文件的目录系列中的每个项目,并忽略那些不包含匹配文件的目录。
示例4:
@关闭回声
Rem删除*的所有文件。驱动器c中的chk。
for /r c: %%h in (*。chk) do del /q %%h
中止
注意:del /q表示在安静模式下删除(无需确认)
三、参数 /L
For /L %%变量in(起始值,每次增量,结束时的比较值)do命令
(大写的L也可以是小写,主要是视觉上不会和数字1混淆,不使用小写)
(起始值,每一个增量,末尾的比较值)等价于一个算术数序列。从“起始值”的个数开始,每一个增量(也可以设为负数)为“每一个增量”,最后与比较值进行比较。如果超过,将退出for循环(并且不会执行此轮结束时的do命令)。
例如,(1,1,3)会产生序列(1 2 3);(1,2,9)将产生序列(1 3 5 7 9);(5,-1,1)会产生序列(5 4 3 2 1);(1,3,18)将产生序列(1 7 10 13 16)
实例5
@关闭回声
*在驱动器d上建立五个文件夹aa1~ aa5。
对于(1,1,5)中的/L %%i,请执行md d:aa %%i
中止
注意:在一行的开头,一个冒号:后面跟着一个名字就是标签行,对应的是批处理中“go”后面所指向的位置,而一个双冒号:一般用于注释。在批处理中,注释可以用rem加空格来表示。两者略有不同。rem注释在命令未关闭时会显示在屏幕上,但:在任何情况下都不会显示。
四、参数 /f
此参数/f将打开(集合)中的文件,以便for命令可以处理编辑操作,如读取、添加、删除和替换文本文件。它功能强大,所以相对复杂。
文件名集
for/f " options " % variable in(" string "-set)do命令
“命令集”
在/f之后,您可以有几个选项。当然,它也是一个限定格式,没有选项,但是有了参数,就必须整体用引号括起来。以下集合主要以三种形式形成。最后,在每一轮for循环中,您将读取一个字符串来分配指定的%变量和从选项派生的附加变量,然后在do之后执行命令。
用下面的例子来解释,逐步理解每个子项的用法。
实例6
假设d:abc.txt如下:
性别,年龄等。-等级
张南36 A-1
李楠29 B-2
赵六女31 A-2
执行以下命令:
for /f %c in (d:abc.txt) do @echo %c
屏幕显示:
(全名)
张三
李四
刘钊
解释:当for /r默认为“%variable”前的参数选项时就是这种情况。默认情况下,循环中的每一轮都将由空格分隔,字符串将在打开的文件中逐行分段。因为没有添加额外的变量(也就是只有一个变量%c),所以只会把第一段的字符赋给%c,然后执行do之后的命令,然后进行下一轮循环,默认忽略空行。
改变它:
for /f "skip=1 tokens=1,4 delims=" % c in(d: ABC . txt)do @ echo % c % d
显示为:
张
李B-2
赵A-2
解决方案:
Skip=1表示文本开头要忽略的行数为1 ——忽略几行。
Delims=在一行中,用什么单个符号分隔字符串作为阅读赋值的单位(形成段落)(可以是多个字符的组合,中间不能加空格,理解为多个单字符。如果需要空格,必须放在最后)。在本例中,中间数字后的空符号表示仅使用空格分隔。3354用什么刀切的?
等号符号=1,4后面的数字表示依次将哪个分隔的字符串段分别分配给%变量和顺序附加的变量。在这个例子中,第一段赋给%c,第四段之后的一个变量赋给%d,可以写成tokens=1,2,5-7或者tokens=1,2,3*。5,6,7(依次赋给%c,%d,%e,% f,%g),1,2,3,3之后的所有段(赋给3个变量),1,2,5,7(赋给4个变量),tokens=之后的数字可以乱序,换句话说————最多需要取哪几段?
in (variable)中的变量表示初始变量名,附加变量名根据tokens中定义的总数进行扩展。如果总数为3,则%d和%e将被添加到%c,而%d% e将被添加到%C.在这个例子中,tokens=1和4只需要两个,初始的一个是在In()的括号中的%c,是每行的第一个。
以第二行(skip=1跳过第一行)为例。在《张三南三十六A-1》(也是用空格隔开的)中,它被空格之刀切成了五段。只要第一行和第四行,即张三被分配给% c,A-1被分配给%d,执行@echo %c %d然后下一轮.
稍作改动:
for /f "skip=1 tokens=4,1 delims=-" % c in(d: ABC . txt)do @ echo % c % d
显示为:
一张三
李四
刘钊
例7
假设d:aa.txt如下:
驱动器D中的卷是MYDA
卷序列号是C35D-8998
D:tmp目录
2001年9月25日上午10时40分
2001年11月12日下午04:29 795 buple . txt
2002年11月4日上午4时18分
3文件12,673字节
0个目录5,020,200,655字节可用
在命令行中,输入:
for/f skip=5 tokens=5 % a in(d: aa . txt)do @ echo % a
将显示:
yg0925.txt
buple.txt
vitn.txt
自由的
我想显示文件中列出的文件(当然,我也可以对文件执行其他命令操作)。
Skip=5忽略前五行,默认情况下,tokens=5通过获取每行的第五个字符将文件名赋给变量%a。美中不足的是最后一行有文件名之外的名字(当然也可以用其他方法处理这种多余,但是for/f中没有提供忽略最后几行的格式),而倒数第二行没有第五段。
显然,例子中aa.txt中的内容是执行了一个dir命令后的内容。它可以使用类似的命令:
要创建的目录d:aa.txt
顺便说一下,如果给dir加上合适的参数/b,就可以避开多余的部分,也可以加上/ad只显示目录,加上/a-d只显示文件等等。
然后,我们可以直接编写命令,放在in之后的( command-set)中。
for/f skip=5 tokens=5 % a in( dir )do @ echo % a
一样的效果。
注意:命令集应该用单引号括起来,以表示它不是文件集。如果它用双引号括起来,则表明它是一个字符串集。此示例说明了for命令的用法。如果有这样的用处,我愿意用之前的“题外话”的方法。如果在执行这个示例后没有显示任何内容,您需要首先执行集合中的命令,这取决于它的显示格式。也许您需要将tokens=5改为tokens=4,或者您应该向dir添加参数/a-d以避免显示目录。
如果集合由多个文件组成,那么在处理完一个文件后,将会处理另一个文件,每个文件的循环次数(do命令的数量)将会不同。
如果集合是一个命令生成的系统,那么你必须先熟悉这个命令执行后会产生什么效果的字符系统,才能正确安排后续的do命令。
画龙点睛:不管in之后的集合是什么形式,for/f最后都分解成字符串。根据需要,是否“忽略几行”(skip=)、“用什么刀切”(delims=)、“最多只取几段”(tokens=),将集合中形成的字符串逐行和可能地赋给%或%%后的变量。此处未对所有参数进行全面解释,请使用for/?检查。(下面的斜体是复制的帮助中的内容)
例如:
对于带有空格的文件名,需要用双引号将文件名括起来。为了以这种方式使用双引号,您还需要使用usebackq选项。否则,双引号将被理解为定义要分析的字符串。3354换句话说,有了usebackq(放在for /f之后的引号中)参数,它仍然是in in()中双引号中的文件名。
如果再加上一些其他复杂的系统和网络相关的命令(比如wmic和net),那才是FOR hero的本色。例如,您可以使用以下命令:WMIC逻辑磁盘,其中“驱动器类型=3”获取名称。显然,在所有磁盘中找到一个文件并执行相应的操作是很容易的。用好for命令还需要其他命令和计算机基础的配合。呵呵,我水平有限,写的也只是低级.希望能对刚来这里看的指挥官们的DOS有所帮助。