广州宝洁公司地址:FOR的集与通配符上

来源:百度文库 编辑:中财网 时间:2024/05/03 22:45:26

第二节 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、查询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

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

(三)系统变量

(暂时省略)

注:此文非本人原创,属转载!!!