分享

批处理教程:FOR入门与进阶秘籍

 JT_man 2012-01-19
批处理教程:《FOR入门与进阶秘籍》之前言、目录与后记
2009-01-18 22:14

文章来源:http://hi.baidu.com/cjiabing/blog/item/f2512d7f69abac0f29388a70.html
 

附:谢谢大家对本教程的热爱和支持,经过不懈的努力,我对该教程进行了重新修改,有时间放上来与大家分享,敬请关注本空间《甲兵时代》原创作品!

 

 

阅读了许多批处理作品,发现几乎每个批处理作品都用到了For命令,真是“无For不批”啊!学习批处理,For是必过的一关。

写这篇文章的时候,我和诸位一样对For命令一知半解,或者说一无所知。本人喜欢一边学习,一边写教程,呵呵,牛吧?!其实就是学习总结了。通过本学习总结将一些学习心得和大家交流交流。

本文争取做到简明、易懂、生动,让你一看就懂,一学就会。

案例丰富、实用是本教程的一大特色。每个代码都经过作者的认真的探索和检测,均能正常使用。由于本人水平有限,有些无法解决的问题也列出来,目的是与大家交流。

 

阅读建议:

首先要有玩的兴趣和学的渴望。

如遇到不明白的地方,请跳过往下读。

阅读过程中要有耐心,循序渐进,不要贪快或怕繁。

一边阅读,一般使用代码做练习,学以致用进步最快。

在未熟悉代码之前,请用手工输入代替复制粘贴。

删除某个关键代码观察批处理执行的效果,加深认识。

有时候不要万事都问个为什么,记住就行了,以后慢慢再理解。

谦虚地求教,大胆地试验,合法地使用,热情地助人。

 

“站得高,看得远。”本教程主要参考了以下佳作:

“尘土飞扬”的《for语句从入门到精通》[2008.12.7更新]

“随风”《for 命令f参数通俗讲解》

“非常批处理”论坛版主“伤脑筋”的一些文章。

DOS批处理高级教程精选合编》【20080331windows Xp)】

《批处理阶段教程奥运最终版[英雄出品]

∮明天去要饭《简明批处理教程》

《批处理教程电子书》

dos6.22帮助手册》

“批处理之家”、“非常批处理”以及“中国DOS联盟”、“DOS之家”等网站的帖子。

 

衷心感谢各位作者为批处理的传播做出的“不可磨灭的贡献”,并向他们致敬!

为发扬网络“自由”、“开放”和“共享”的精神,本教程免费阅读、转载和修改,但拒绝商业目的利用。

感谢我的父母,并将此荣誉赠给我的父母。

欢迎访问本人博客:http://hi.baidu.com/cjiabing

甲兵时代

                                                      2009-1-15

 

目录

 

前言

第一节    FOR的语法

一、概述

二、FOR的语法

三、实战应用

第二节 FOR的集合与变量

一、FOR的集合

1、概述

2、通配符

3、组合命令

二、FOR的变量

1、概述

2、扩充变量

    第三节 FOR的DO

一、概述

二、类型

三、运用

第四节 FOR的参数

一、参数/D

二、参数/R

三、参数/L

四、参数/F

(一)选项EOL

(二)选项Skip

(三)选项Delims

(四)选项Tokens

(五)选项Usebackq

(六)综合应用

      第五节 FOR的综合应用

一、FOR与其他命令的组合

二、精选例句

后记

后    记

 

批处理看似简单,其实博大精深,我们只好学习FOR的精神,一块一块的将它啃下来。这里用一段搞笑对话做结,提前祝大家新年快乐。欢迎访问甲兵时代的博客:http://hi.baidu.com/cjiabing

 

徒弟:

师父,你也太不负责任了!好得不是《葵花宝典》,让我挥刀自宫到一半突然发现没有了下篇……&…………@#~¥……

师父:

残缺的东西才是最有价值的东西嘛!本FOR秘籍虽是残篇,却也引领你跨过了批处理最高深莫测的FOR门槛,在批江湖中,你已不知不觉的晋身为一代武林高手。

徒弟:

真的?

师父:

真的,不骗你的!

好了,现在你可以出山了。临行前为师给你一个忠告,日后不要荒废了武艺,要牢记恩师教诲,勤加练习,将之发扬光大。批江湖鱼龙混杂,你行侠仗义也罢,违法作恶也罢,为师管不了那么多了,你好自为之吧。

徒弟:

师父,临行前我有一个请求,我想和你一起过年,可以吗?

师父:

这个嘛……用for来说,看你口袋有多大,每次从口袋里拿出的红包有多少,以及送红包的真诚度。

徒弟:

@恶臭哦 哦方法

佛瑞 %%i in(老师原来也是性情中人啊! 恭祝各位牛年学习进步!~) 的哦 恶臭哦 %%i

怕use》努力

FOR参数F的选项delims与tokens上(原创)

FOR参数F的选项delims与tokens下(原创)

批处理:FOR参数之综合运用下(原创)

批处理:FOR参数之综合运用上(原创)

批处理:FOR参数/F之tokens详解(原创)

批处理:FOR的参数/F之delims详解下(原创)

批处理:FOR的参数/F之delims详解上(原创)

批处理:FOR的参数/F与eol、skip(原创)

批处理:FOR的参数/L(原创)

批处理:FOR的参数/D和/R(原创)

批处理:FOR的变量下(原创)

批处理:FOR的集与变量中(原创)

批处理:FOR的集与通配符上(原创)

批处理:FOR的语法下(原创)

批处理:FOR的语法上(原创)

批处理教程:《FOR入门与进阶秘籍》之前言、目录与后记(原创)

批处理专题(原创)

本篇为原创,转载请注明出处。 http://hi.baidu.com/cjiabing     甲兵时代,为你服务。

第一节 FOR的语法

 

 

恭喜你捡到了一本批处理秘籍《FOR入门与精通》!

本秘籍为做到“一看就懂,一学就会”有些地方反复讲解和举证,如觉得啰嗦请直接跳过。考虑到FOR的参数比较复杂,也是重点,所以放到了最后。如对第二、三节的内容早已了解请直接跳过。如有其他疑问欢迎访问本人博客:http://hi.baidu.com/cjiabing。下面我们开始FOR的神奇之旅……

 

 

一、概述

 

欢迎进入FOR的神奇世界!

FOR就像魔法师手里的魔法棒,武士手里的剑。或许这样形容更好,批处理命令相当于法术师的魔咒,而FOR就是一句最厉害的的魔法咒语。电影里的道士驱魔的时候,总要念一些经咒,好比“阿弥阿弥哄”,FOR就是这个“阿弥阿弥哄”。实在不行你就当它是阿里巴巴的“芝麻开门”算了,当你在一个批处理里使用FOR命令时,它就能帮你打开一个命令开关,从而帮你打开一个神奇的批处理世界。

 

课前思考题:

李四送喝醉了的张三回家,张三家门锁着,没人在家。李四从张三口袋里掏出一串钥匙,他不知道哪个钥匙能开门,你说他该怎么办?

 

 

二、FOR的语法

 

FOR是一个循环命令。所谓的循环指,对一组文件逐一运行一条命令,或对一组文件中的每一个文件执行某个特定命令。FOR常用于循环命令、遍历查询、解析文本等。

 

1FOR的基本语法格式:

FOR /参数 %%I       IN (Command1)   DO Command2

FOR /参数 %%字母     IN (集合)        DO 命令 [命令参数]

FOR /参数 %%Variable IN (Set)       DO Command [Command-Parameters]

(注意:这三条命令的语法格式都一致,只是表示方式不同而已。一般情况下,本教程采用第一条表达,采用第二条讲解,采用第三条补充。)

 

2、用法:

一句话总结:从集合中依次逐一提取变量执行后面的命令。

 

FORINDO

这是FOR命令的基本结构,三个基本组成部分缺一不可。

 

FOR

负责打开循环命令开关。

 

IN

负责从集合中抽取元素替换变量。它后面的括号不能省略。

 

DO

负责安排需要执行的命令和动作。它可以是一个命令如echo,也可以是一组命令如if exist

 

/参数、%%I(Command1)Command2是它的动态组成部分,也是我们讲解的重点。

 

参数:

用来解释FOR,设置循环的模式。FOR常用的参数有/D/F/R/L

 

变量:

形式如%%I。集合中用来执行后面命令的任意一个可能的数值,需要执行命令的对象,一个替换位置。当它空缺时是变量,当FOR运行时它抽取集合里的数值替换自己,从而变成一个固定值。因此它来自集合,限于集合范围。

 

集合

范围、总量。是一个数据库,由固定数值组成,向变量提供固定数值,用于替换变量。变量和集合的关系是需求与供给的关系。集合的个数决定了需要循环的次数。集合要用括号括起来,不能缺少。

 

 

3FOR的处理流程:

打开循环命令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!”的批处理。

@echo off

for %%i in ("l love you!") do echo %%~i

pause>nul

第二节 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"

rem 也可用for %%i in (*.*) do echo %%i

rem %%i两边有双引号与无双引号的区别在于显示的文件两侧有无双引号。

pause

讲解:

*.*的第一个星号表示文件名,第二个星号表示扩展名,整体表示所有类型的文件。

 

2、列举当前目录下所有扩展名为txt的文件:

@echo off

for %%i in (*.txt) do echo "%%i"

pause

讲解:

*.txt表示所有扩展名为txt的文件,也就是所有文档(记事本)文件了。

 

3、查询txtdoc两种类型的文档:

@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、查询文件名第二个字母为Omp3文件:

@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、搜索Fmp3文件:

@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。”

 

"2009115"

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

扩充环境变量常用来提取一些关键字符,或排除其他一些多余因素。

 

(三)系统变量

(暂时省略)

第三节 FORDO

 

 

一、概述

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、请比较查询命令DIRFOR /D

2、请编写一个只搜索文件名而不搜索文件夹名的批处理。

 

 

二、/R参数——遍历搜索

 

格式:

FOR /R %%I       IN (Command1)   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# 以递减数值的方式逐步执行此范围内的值。

 

FOR15这几个数字排一下顺序。

例:递增方式。

@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控制着startend的生成方式。当step为正时是递增序列,当step为负时是递减序列。如果step=0则循环下去?

 

例:start,step,end三者的数值关系。

@echo off

for /l %%i in (2,2,13) do echo %%i

pause>nul

运行结果分行显示24681012

讲解:

start,step,end三者的数值关系是:

start > end

step为正时,start+step决定%%i的最小取值范围,end决定%%i的最大取值范围。

step为负时,start+step决定%%i的最大取值范围,end决定%%i的最小取值范围。

 

例:创建三个以数字123命名的文件夹。

@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,内容如下:

::我的测试

aaabbbcccddd

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”中的第一行有几种方法?

拓展思考:如何单纯屏蔽第五行?

(三)delims=符号集 分隔符

 

 

附:谢谢大家对本教程的热爱和支持,经过不懈的努力,我对该教程进行了重新修改,有时间放上来与大家分享,敬请关注本空间《甲兵时代》原创作品!

 

格式:

FOR /F "Delims=符号集" %%I       IN (Command1)   DO Command2

用法:

一句话总结:忽略分隔符,切分字符串。

1)以文本中的标点符号来定义分隔符。分隔符通常就是空格键和跳格键。

2)被定义为分隔符的标点符号将被忽略(隐藏),如果分隔符后面还有内容,默认该分隔符与该内容将被一同忽略,除非使用tokens定义显示。因此,该命令可以用来屏蔽标点符号和提取第一列的信息。

3)被定义的分隔符前后内容将变成独立的小节(或列),这些小节可以为FOR命令编辑,比如使用tokens提取。

 

注意:

符号集,指用做分隔符的标点符号可以是一个,也可以是多个。

delims定义多个分隔符时,符号之间不用空格,用做分隔符的空格要放到最后

 

首先要弄清楚分隔符。分隔符就是用delims指定的标点符号了,该标点符号就是文本中的标点符号。注意:这里的分隔符并非文本中的所有标点符号,而是指被delims指定的标点符号。如下图

其次要弄清楚分节、分列。我们把每行两个分隔符之间的文字内容称为小节、列。注意:是分隔符之间,而非标点符号之间。如下图。

 

例:《易经·乾》的开头:

  乾:元,亨,利,贞。

       初九:潜龙,勿用。

       九二:见龙再田,利见大人。

       九三:君子终日乾乾,夕惕若,厉无咎。

       九四:或跃在渊,无咎。

       九五:飞龙在天,利见大人。

       上九:亢龙有悔。

       用九:见群龙无首,吉。

将该内容保存到为文本文件“易经.txt”,下面我们做实验。

 

如果使用Delims来定义分隔符,你可以使用原文中的冒号(:),写法是“Delims=:”(使用英文双引号)。冒号作为分隔符后,冒号前后的内容被分成两个小节:

 

 

第一小节(列)

分隔符

第二小节(列)

第一行

元,亨,利,贞。

第二行

初九

潜龙,勿用。

第三行

九二

见龙再田,利见大人。

第四行

九三

君子终日乾乾,夕惕若,厉无咎。

第五行

九四

或跃在渊,无咎。

第六行

九五

飞龙在天,利见大人。

第七行

上九

亢龙有悔。

第八行

用九

见群龙无首,吉。

备注:

默认只显示第一列

默认忽略分隔符

默认忽略第一个分隔符后的内容

批处理:FOR的参数/F之delims详解下(原创)
2009-01-18 22:37

代码:

@echo off

for /f "delims=" %%a in (易经.txt) do echo %%a

pause>nul

 

运行结果将显示第一小节(列)的内容。

原因是没有定义显示的列,默认情况下忽略第一个分隔符(冒号)后面的内容。

 

要显示列,需要用到下节学习的tokens。如:

@echo off

for /f "tokens=1,2 delims=" %%a in (易经.txt) do echo %%a %%b

pause>nul

 

你也可以使用冒号(:)和逗号(,),写法是“delims=:,”(使用英文双引号)。原文中的每行文字将被作为分隔符的冒号和逗号分成多个小节:(不知道百度怎么搞的,竟然说我的表格超载!省略了)

代码:

@echo off

for /f "delims=:," %%a in (易经.txt) do echo %%a

pause>nul

运行结果将显示第一小节(列)的内容。

没有定义列的时候,默认只显示第一列,忽略分隔符和第一个分隔符后的内容。

 

例如:文本“静夜思.txt”的内容是:

床前明月光,疑是地上霜,举头望明月,低头思故乡。

 

文本中有四句古诗,诗句之间用逗号分隔。古诗原本是没有标点符号的,标点符号是后人才加上去的。逗号在语文上是语气暂停的意思,其实就是用来分隔语句意思以便于阅读和理解。Delims=,的意思就是提取逗号做分隔符,并以此将诗句分成四个小列或小节。

 

 

 

第一列

分隔符

第二列

第三列

第三列

第一行

床前明月光

疑是地上霜

举头望明月,

低头思故乡。

 

 

如果我要用for将四句诗都显示到屏幕上,不需要任何参数即能实现:

@echo off

for /f %%i in (静夜思.txt) do echo %%i

pause>nul

 

如果我只要“床前明月光”这句话,就需要delims帮忙了:

@echo off

for /f "delims=" %%i in (静夜思.txt) do echo %%i

pause>nul

 

讲解:

delims=后面跟了一个逗号,表示用原文中的逗号作为分隔符(划分的方法)将古诗分成四个小节。默认情况下,delims只显示分隔符前的第一小节,分隔符通常被忽略掉。显示其他小节的诗句要用到列提取命令“tokens”。

 

仍用前面eol里的文本“a.txt”做试验。

例:如何只显示每行的第一个标点前的内容?

@echo off

for /f "eol=: delims=, " %%i in (a.txt) do echo %%i

pause>nul

 

运行结果显示:

aaa

iii

eee

你好

 

注意:

文本中有英文的点号和中文的逗号,点号要放在逗号前面。

符号集中(也就是=后面的标点符号),各个符号之间没有空格。

文本中用空格分隔的,符号集里中文逗号后面只有一个空格,且必须放到最后。

用于分隔的标点符号重复的一般只取一个做代表。

for默认是以空格和,:;/等标点符号作分割符的,所以要取得整行内容通常会用"delims="这样的形式来取消for的默认分割符。

 

例:为什么第三行的iii后面的内容不见了?

@echo off

for /f    %%i in (a.txt) do echo %%i

pause>nul

讲解:

这里没有使用delim进行分隔,而带有空格的行空格后面的内容被忽略了,原因就是默认情况下,也就是没有即使没有用delims选项,for也会以空格作为分隔符,将空格后的内容屏蔽掉。

 

使用delims的目的主要是通过切分字符串获得可编辑的字符串以便于进行下一步编辑。Delims好比一把西瓜刀,文本信息就好比西瓜,使用delims这把西瓜刀将文本这个西瓜切分成许多小块,这样吃起来就方便了。

如果你想吃其中的某一块,怎么办呢?直接用刀叉tokens提取就可以了。请看下节。

 

练习:

1、请简单说说分隔符和标点符号的区别。

2、请举例说说delims的作用。

3、请用delims处理以下新闻标题:

第十六届中共中央组织结构图_中国共产党第十七次全国代表大会专题_新闻中心_新浪网.mht

4、请用delims处理以下网页标题:

关闭垃圾服务让XP系统运行更顺畅运行_系统 垃圾 服务 关闭 需要 内存 这个 共享 占用_中国网管联盟.mht

批处理:FOR参数/F之tokens详解(原创)
2009-01-18 22:38

(四)tokens=x,y,m-n 提取列

 

 

附:谢谢大家对本教程的热爱和支持,经过不懈的努力,我对该教程进行了重新修改,有时间放上来与大家分享,敬请关注本空间《甲兵时代》原创作品!

格式:

FOR /F "tokens=x,y,m-n" %%I       IN (Command1)   DO Command2

用法:

一句话总结:提取列。(JT_man注:如果省略,默认只能显示第1列)

通俗讲,共同提取每一行的第m小节的内容。

因此,可以用该命令来指定提取文本信息。

tokens=有时表示提取全部。

tokens=m表示提取第m列。

tokens=m,n表示提取第m列和第n列。

tokens=m-n表示提取第m列至第n列。

Tokens=*表示删除每行前面的空格。忽略行首的所有空格。

tokens=m*提取第m列以后的所有字符,星号表示剩余的字符。

tokens=m,*提取第m列及以后的所有字符,星号表示剩余的字符。

输出变量的个数由定义了的tokens决定。

FOR 语句中显式声明 %%i。使用tokens= 隐式声明%%j %%k。只要不会引起试图声明高于字母“z”或“Z”的某个变量,则使用tokens= 可以指定最多 26 个输出变量。

 

接着前面的例子“静夜思”。

如果我要提取第三小节“举头望明月”,如何做到?

@echo off

for /f   "delims= tokens=3"   %%i in (静夜思.txt) do echo %%i

pause>nul

 

讲解:

首先用delims=,表示命令要用逗号作为诗句的分隔符将四句分成四小节。然后用tokens=3提取第三小节,即“举头望明月”了。

delims=tokens=共用一对双引号,如果单独用双引号,则FOR命令返回的只能是它们之中的一个。因为在第一节说过,FOR是逐一读取命令的,将delimstokens分开后,FOR只能一次读取一个,不能一次全部读取。

 

注意:

Tokens常和delims一起使用。

首先,一行内容被delims用分割符号如逗号等分隔成许多小段或小节。

然后,tokens才能提取每行之间对应的这些小段或小节——列。具体看下面例子。

 

例:提取前面例子文本“a.txt”中每行的第三段内容“ccc”、“kkk”、“ggg”、“考试”。

@echo off

for /f "skip=1 delims=, tokens=3" %%i in (a.txt) do echo %%i

pause>nul

注意:为什么kkk不出现呢?

 

例:如何屏蔽掉文本“a.txt”中的标点符号?

@echo off

for /f "skip=1delims=, tokens=1-4" %%i in (a.txt) do echo %%i %%j %%k %%l

pause>nul

 

讲解:

%%i %%j %%k %%l是输出变量,它的个数由tokens后面的(m-n)决定,一般有(n-m+1)个,但不能超过Z

并且%%后面的字母存在先后顺序,%%a %%b是顺向,倒过来则是逆向的。

代行号的tokens=m*,星号表示m后面的所有剩余的列。

例:

for /f "tokens=*"   %%i in (a.txt) do echo %%i

讲解:

没有指定具体的列,"tokens=*"将提取全部列,后面只需一个输出变量%%i

 

例:

for /f "tokens=2*"   %%i in (a.txt) do echo %%i %%j

讲解:

"tokens=2*"提取第二列以后的所有字符,星号表示剩余的字符。输出变量%%i对应于2的输入变量,%%j对应于星号的输入变量。

注意:

这里没有使用delisms但却以空格分隔了,是因为FOR默认空格是做分隔符的。

 

例:屏蔽掉“易经.txt”中的标点符号:

@echo off

for /f "tokens=1-5 delims=:," %%a in (易经.txt) do echo %%a %%b %%c %%d %%e

pause>nul

讲解:

delims定义了两个分隔符“:”和“,”时,提取列要用到tokens

有五个列,所以tokens要定义提取第一列至第五列,即1-5,相应地,后面需要五个输出显示变量%%a %%b %%c %%d %%e。你也可以这样修改,避免过多的变量符号【补充?】

你也可以将最后多余的句号定义为分隔符“delims=:,。”将其屏蔽掉。

 

练习:

1、 请简单说说tokens的作用

2、 Tokens=1,3-5后面的输出变量需要多少个?

3、 请使用tokens提取下面网页的标题《硬盘知识及故障大总汇( 2)》:

手机,3G手机,智能手机,手机电影,手机软件,手机游戏,铃声,主题,图片,电子书,手机维修,手机大全,手机报价,下载,智能手机的测评,使用心得 硬盘知识及故障大总汇( 2) - 电脑技术交流区 - 3g365智能手机论坛 - powered by Discuz! Archiver.mht

批处理:FOR参数/F之usebackq上(原创)
2009-01-18 22:40

(五)usebackq

 

该命令不是很明朗,这里只能指出使用"usebackq"时需要注意的问题,就是集合内使用双引号、单引号和后引号的情况。

 

1、 当集合中的文件名file-set含有空格时使用双引号。

语法:

FOR /F "usebackq" %%I   IN (“FileNameSet”)   DO Command2

用法:

集合中的文件名或路径含有空格时,如“file”与“Name”之间有空格,此时需要用双引号将两者括起来,保持文件名或路径的完整性,并在参数后打开"usebackq"

 

集合中的文件名没有空格:

@echo off

For /f %%a in (C:\note.txt) do echo %%a

pause>nul

显示结果:

能正常读取文档note.txt里的内容。

 

集合中的文件名含有空格,无法读取文本note.txt里的内容:

@echo off

for /f %%a in (C:\Documents and Settings\Administrator\桌面\note.txt) do echo %%a

pause>nul

显示结果:

系统找不到文件C:\Documents。。

 

即使加上双引号也只是将其作为字符串显示:

@echo off

for /f %%a in (“C:\Documents and Settings\Administrator\桌面\note.txt”) do echo %%a

pause>nul

显示结果:

C:\Documents

 

使用"usebackq"但不加双引号,会找不到路径:

@echo off

for /f "usebackq" %%a in (C:\Documents and Settings\Administrator\桌面\note.txt) do echo %%a

pause>nul

显示结果:

系统找不到文件 C:\Documents。。

 

正确的方式:使用"usebackq"并且在集合中用双引号将含有空格的文件名包含住。

@echo off

for /f "usebackq" %%a in ("C:\Documents and Settings\Administrator\桌面\note.txt") do echo %%a

pause>nul

显示结果:成功显示文档note.txt里的内容。

 

讲解:

这里所说的是文件名,如“note.txt”,是区别于后面所说的字符串的。

我的理解,字符串是集合里直接用于屏幕显示的语句,如“我爱北京天安门”,它不是用于执行命令的,也不同于文件名。

文件名是用于间接显示字符串和打开文件或命令的,如文件名“note.txt”它本身不直接显示在屏幕上,如果直接显示就是字符串,如果它的目的是打开文本里的信息那它是文件名。

当文件名或路径中间带有空格的时候,如“Documents and Settings”,应该使用usebackq和双引号。

 

2、当使用usebackq处理文字字符串时使用单引号。

格式:

FOR /F "usebackq" %%variable IN ('command') DO command [command-parameters]

注意:

'command'使用的是“单引号”,区别于上面(`set`)的“后引号”

 

:

@echo off

for /f "usebackq delims=" %%a in ('Hello "AnsiPeter" Word!') do echo.%%a

pause>nul

显示结果:

Hello "AnsiPeter" Word!

讲解:

前面提到,字符串是用于直接屏幕显示的语句,显然“Hello "AnsiPeter" Word”被直接显示到屏幕上了。这里只是强调usebackq也可以显示字符串,而且使用单引号,不同于不用usebackq时使用的双引号。

不使用usebackq也可以显示字符串,例:

@echo off

for /f   "delims=" %%a in ("Hello "AnsiPeter" Word!") do echo.%%a

pause>nul

显示结果同上

注意:不使用usebackq显示字符串时,字符串中有空格时必须用英文状态下的双引号。更多请阅读下一节的案例“伟大的中国人民万岁 万岁 万万岁”。

批处理:FOR参数/F之usebackq下(原创)
2009-01-18 22:40

3、当集合内是可执行的命令时使用“后引号”。

语法:

FOR /F "usebackq" %%variable IN (`command`) DO command [command-parameters]

注意:

后引号在键盘上ESC键的下面,“~”键。英文状态下轻按一下。

 

例:

@echo off

FOR /F "usebackq delims==" %%i IN (`set`) DO @echo %%i

pause

显示结果:

枚举当前环境中的环境变量名称。

讲解:

`set`由于使用了usebackq和后引号,因此它表示命令执行,即括号内的`set`FOR以外的一个命令,它在DO后面的echo之前先执行了。

命令区别于文件名和字符串的地方是,命令是批处理中设定可以作用于其他命令、文件名和字符串执行相应任务的字母和标点符号。而文件名和字符串通常是被动地接受命令的安排的。因此,命令是早先设计好的,我们只是自由地组合它们而已。

 

 

未使用usebackq和使用usebackq时集合内的符号比较:

 

未使用参数usebackq时:

使用参数usebackq时:

双引号””

表示字符串,即"string"

当文件路径或名称中有空格时,用双引号括起来。

单引号’’

表示执行命令,即'command'

表示字符串,即'string'

后引号``

(未研究)

表示命令执行,即`command`

 

练习:

1、请简要谈谈使用usebackq选项时集合内的标点符号该如何表达。

2、如何修改才能打开腾讯游戏?:

@echo off

FOR /F "usebackq delims==" %%i IN (C:\Program Files\Tencent\QQGame\QQGame.exe) DO @echo %%i

pause>nul

3、请说说集合内的“欢迎访问甲兵时代的博客”是字符号、文件名,还是命令?

@echo off

FOR /F "usebackq delims==" %%i IN ('欢迎访问甲兵时代的博客’) DO @echo %%i& start iexplore.exe hi.baidu.com\cjiabing

pause>nul

批处理:FOR参数之综合运用上(原创)
2009-01-18 22:42

(六)综合应用与思考

 

1、例:将日期中的“-”换成“/”。如将“2009-01-14”改成“2009/01/14”。

@echo off

echo %date%

pause

for /f "tokens=1,2,3 delims=- " %%a in ('date/t') do @echo %%a/%%b/%%c

pause>nul

讲解:先用分隔符命令delims屏蔽掉原来的“-”,然后再echo部分用“/”隔开输出变量。

 

2、例:提取歌曲名字。现有一歌曲文本“歌曲列表.txt”,要求从该列表中提取歌名。

“歌曲列表.txt”如下:

2008-04-28 22:19         2,065,777 饶天亮-玫瑰爱人.wma

2007-10-15 21:09         3,485,010 高一首 我不愿错过.mp3

2008-10-27 12:25         7,727,549 黃凱芹 傷感的戀人.MP3

2008-11-29 23:56             1,273 黄灿 黄玫瑰.lrc

2008-07-24 20:07         4,129,819 黎姿 如此这般的爱情故事.mp3

 

代码:

@echo off

for /f "tokens=4-6 delims=. " %%i in (歌曲列表.txt) do echo %%i %%j %%k

pause>nul

 

讲解:

首先,Delims用点号和空格(点号后面有一个空格)作为分隔符,将上述文本分成4个小节:

第一小节 2008-04-28”——日期

第二小节 22:19”——时间        

第三小节 2,065,777 ——大小

第四小节 “饶天亮-玫瑰爱人.wma”——歌手和歌名

有些歌手与歌名之间含有空格,如“高一首 我不愿错过.mp3”,那么它们也被拆分成两节,即:

第四小节 “高一首”——歌手

第五小节 “我不愿错过.mp3”——歌曲名

其次,用tokens提取每行的第四、五、六小节(竖竖看就是列),即歌手和歌名。

最后显示echo出来。

%%i代表显示提取到的第四列;

%%j代表显示提取到的第五列;

%%k代表显示提取到的第六列。

 

注意:

本命令无法忽略扩展名,也就是无法去掉歌曲的后缀.mp3,试了半天都不行。

如果需要保留扩展名可以同时去掉“delims=.”和“%%k”。

将“tokens=4-6”改成“tokens=4,5”并删掉%%k似乎可以,但有些第五列仍是歌名或者是后缀名。

单独用“delims=.”可以去掉,单独用“tokens=4-6”也可以使用,唯独将两者放在一起时出现了问题。

delims=.”点号后面有一个空格,缺乏空格会无法显示。

tokens=4-6”和“delims=.”之间要用一个空格隔开,前后顺序不能颠倒,否则无法正常显示。

如要去掉扩展名,还得使用扩充变量~n

@echo off

for /f "tokens=4-6" %%i in (歌曲列表.txt) do echo %%~ni %%~nj %%~nk

pause>nul

 

 

3、例:在屏幕上完整显示“伟大的中国人民万岁 万岁 万万岁”。

1)不使用/f参数:

@echo off

for %%a in (伟大的中国人民万岁 万岁 万万岁) do echo.%%a

echo.

echo 不使用/f参数,分节、分行显示。

pause>nul

注意:

如果使用双引号,能够成功显示结果,但结果也带有双引号,不够完美。

 

2)不使用usebackq

@echo off

for /f %%a in ("伟大的中国人民万岁 万岁 万万岁") do echo.%%a

echo.

echo 不使用usebackq,只显示第一小节

pause>nul

 

3)不使用delims

@echo off

for /f "usebackq" %%a in ('伟大的中国人民万岁 万岁 万万岁') do echo.%%a

echo.

Echo 不使用delims,只显示第一小节。

pause>nul

 

显示结果:

伟大的中国人民万岁

系统找不到文件

注意:

echo.%%a之间有一个点号。为什么?你再增加一个进去看看……

“? ”这是什么东西?

当你删除echo.%%a之间有一个点号结果就会变成“? ”。

修改一下,加入“delims=”。

批处理:FOR参数之综合运用下(原创)
2009-01-18 22:42

4)使用delims=以后:

@echo off

for /f "usebackq delims=" %%a in ('伟大的中国人民万岁 万岁 万万岁') do echo %%a

pause>nul

显示结果:

伟大的中国人民万岁 万岁 万万岁

为什么加了delims后就能能够成功显示?

思考:如果把单引号改成双引号或后引号会怎么样呢?

 

4、例:编辑“朱子家训.txt”:

朱子家训

朱熹

 

黎明即起,洒扫庭除,要内外整洁。

既昏便息,关锁门户,必亲自检点。

一粥一饭,当思来处不易;半丝半缕,恒念物力维艰。

宜未雨而绸缪,毋临渴而掘井。

自奉必须俭约,宴客切勿留连。

器具质而洁,瓦缶胜金玉。

饮食约而精,园蔬胜珍馐。

勿营华屋,勿谋良田。

 

1)单纯使用FOR /F即可完整显示内容。

代码1

@echo off

for /f   %%a in (朱子家训.txt) do echo %%a

pause>nul

注意:默认自动取消空行。

 

2)使用delims定义分隔符,并屏蔽分隔符(标点),切分字符串。只显示每行的第一节。

代码2

@echo off

for /f "delims=,;" %%a in (朱子家训.txt) do echo %%a

pause>nul

 

3)使用tokens挑选每行要显示的小节。显示所有内容。

@echo off

for /f "tokens=1-4 delims=,;。" %%a in (朱子家训.txt) do echo %%a %%b %%c %%d

pause>nul

 

只显示第二列和第四列的内容,注意对比内容。

代码:

@echo off

for /f "tokens=2,4 delims=,;。" %%a in (朱子家训.txt) do echo %%a %%b

pause>nul

 

 

5、比较试验:

@echo off

for /f %%I in (变量.txt) do echo %%~I

pause>nul

注意:

请修改本命令做试验,如:

如果不使用参数将显示“变量.txt”。

如果使用/d显示“变量.txt”。

如果使用/r则列举当前目目录以及当前目录下的文件夹。

如果使用/f则显示文本内容。

通过试验比较,更好的体验各个参数的意义。同时明白,批处理的命令并非一成不变的,它小巧而灵活,神通而广大。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多