for/f 练习---做完这几个练习,不懂for/f 都不行
########################################
这是做的练习,不是看的。做了看结果,才知道是什么意思!
只看不做,一头雾水
#############################################
以下练习直接在cmd中做。你可以直接用复制粘贴进行练习。
-----------------------------------------------------------------------------------第一部分
已知 :d 盘有文件夹1,,结构如下:
d:\1\a\a.txt , d:\1\b\b.txt,d:\b\bb (文件夹bb是空的)
练习:for /d %f in (d:\1\*) do @echo %f
答案:
d:\1\a
d:\1\b
*********
练习:for /r d:\1\ %f in (*) do @echo %f
答案:
d:\1\a\a.txt
d:\1\b\a.txt
***********
练习:for /r %f in (d:\1\*) do @echo %f
答案:
cmd上什么都不显示。这时你得 键入 for /? 看看 for /r的语法格式,看了你就明白,错在那里了。
****************
for /r d:\1\ %f in (.) do @echo %f (只显示目录)
答案:
d:\1\.
d:\1\a\.
d:\1\b\.
d:\1\b\bb\.
***********
for /l %f in (10,-2,1) do @echo %f (等差数列的首项是10,公差是-2)
答案:
10
8
6
4
2
*****************
注意:%f 也可以改为%1 练习
-------------------------------------------------------------------------------------第一部分完
-------------------------------------------------------------------------------------第二部分
最复杂的是for /f
第一题:已知:在D盘有文件d:\1\a\a.txt,其中a.txt的内容如下:
---------------
dir
notepad.exe
----------
然后运行:for /f %f in (d:\1\a\a.txt) do %f
答案:
将显示目录
并弹出了记事本程序
******************
注:这叫加载文本,取个名字说起来方便。
第二题 已知: d:\m.txt,其中m.txt的内容与格式(注意格式!)如下:
-------------------------------
11 12 13 14
21 22 23 24
31 32 33 34
-----------------------------------
利用上面的文本运行下面的练习
1) for /f "tokens=1 " %f in (d:\m.txt) do @echo %f
答案:
11
21
31
**********
2) for /f "tokens=2 " %f in (d:\m.txt) do @echo %f
答案:
12
22
32
**********
附d:\m.txt原文:
-------------------------------
11 12 13 14
21 22 23 24
31 32 33 34
-----------------------------------
3) for /f "tokens=3 " %f in (d:\m.txt) do @echo %f
答案:
13
23
33
********
附d:\m.txt原文:
-------------------------------
11 12 13 14
21 22 23 24
31 32 33 34
-----------------------------------
做了上面三个练习,你不懂tokens都不行了。是不是很简单?
继续
4) for /f "tokens=1,2 " %f in (d:\m.txt) do @echo %f %g
(f,g必须按英文字母的次序,并且必须是连续的字母,特别提醒!!!!!!!!!!)
答案:
11 12
21 22
31 32
************
附d:\m.txt原文:
-------------------------------
11 12 13 14
21 22 23 24
31 32 33 34
-----------------------------------
继续:
5) for /f "tokens=1-2 " %f in (d:\m.txt) do @echo %f %g
答案:
11 12
21 22
31 32
**************哦,原来同上题,答案一样
附d:\m.txt原文:
-------------------------------
11 12 13 14
21 22 23 24
31 32 33 34
-----------------------------------
6) for /f "tokens=1-3 " %f in (d:\m.txt) do @echo %f %g %h
答案:
11 12 13
21 22 23
31 32 33
**********
附d:\m.txt原文:
-------------------------------
11 12 13 14
21 22 23 24
31 32 33 34
-----------------------------------
注意:语句里面参数的个数,命名方法,
这个练习里面的参数改为如下形式练习,你试试看会怎样的结果?:
for /f "tokens=1-3 " %1 in (d:\m.txt) do @echo %1 %2 %3
7) for /f "tokens=1,* " %f in (d:\m.txt) do @echo %f %g
答案:
11 12 13 14
21 22 23 24
31 32 33 34
***********
附d:\m.txt原文:
-------------------------------
11 12 13 14
21 22 23 24
31 32 33 34
-----------------------------------
8) for /f "tokens=1,* " %f in (d:\m.txt) do @echo %f %g %h
答案:
11 12 13 14 %h
21 22 23 24 %h
31 32 33 34 %h
***************
附d:\m.txt原文:
-------------------------------
11 12 13 14
21 22 23 24
31 32 33 34
-----------------------------------
注意:%h不管用,自己总结一下,做下面的练习对比一下
for /f "tokens=1,* " %f in (d:\m.txt) do @echo %f %g
本句也可以写出:for /f "tokens=1* " %f in (d:\m.txt) do @echo %f %g
就是说*前可以不要逗点。但还是建议写出逗点,这样规范点。
-----------------------------------------------------------------------------------第二部分完
-----------------------------------------------------------------------------------第三部分
下面练习delims
已知:文本 d:\my.txt如下:
------------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
----------------------注意汉字里面的空格
1) for /f "tokens=1 delims=d " %f in (d:\m.txt) do @echo %f
答案:
r
r
11
21
31
**********
--附原文-d:\my.txt----------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
---------------------
说明:d是自定义定界符,你也可以利用delims设置为其他的符号,比如你可以设置成k,分号等等,系统默认的定界符是空格即系统默认是"delims= ",每一行,被d划分为若干段。for是按段读取数据的。
本语句的意思就是:for 要对d:\m.txt中的数据进行筛选,"tokens=1 " 意思是吸取m.txt中每行的第一段数据。如果是tokens=2,即是吸取m.txt中的每行的第二段数据。tokens就吸取之意。
2) for /f "tokens=2 delims=d " %f in (d:\m.txt) do @echo %f
答案:
这是
这行的下面
12
22
32
******
--附原文-d:\my.txt----------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
---------------------
3) for /f "tokens=3 delims=d " %f in (d:\m.txt) do @echo %f
答案:
注释
就是正文了
13
23
33
************************
--附原文-d:\my.txt----------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
---------------------
4) for /f "tokens=* " %f in (d:\m.txt) do @echo %f
答案:
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
*************************
--附原文-d:\my.txt----------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
---------------------
5) for /f "tokens=2* " %f in (d:\m.txt) do @echo %f %g
答案:
这是 注释
这行的下面 就是正文了
11 d 12 d 13 d 14 d
21 d 22 d 23 d 24 d
31 d 32 d 33 d 34 d
******************
--附原文-d:\my.txt----------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
---------------------
---------------------------------------------------------------------------------------第三部分完
注明:系统默认定界符是空格,delims后可以跟多个定界符
---------------------------------------------------------------------------------------第四部分
继续练习eol---这个是定义注释行,相当于rem
已知:d:\m.txt,其内容如下
---------------------------------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
--------------------------------------
1) for /f "tokens=* "%f in (d:\m.txt) do @echo %f
答案:
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
*******************这是复习第三部分的tokens
-----附原文-m.txt---------------------------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
--------------------------------------
2) for /f "eol=r tokens=*" %f in (d:\m.txt) do @echo %f
答案:
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
***********************m.txt中的前两行呗注释掉了
-----附原文-m.txt---------------------------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
--------------------------------------
继续练习skip---跳跃
3) for /f "skip=1 tokens=* " %f in (d:\m.txt) do @echo %f
答案:
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
*********************哦,原来for跳跃到了第二行,然后开始读取数据
-----附原文-m.txt---------------------------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
--------------------------------------
4) for /f "skip=2 tokens=* " %f in (d:\m.txt) do @echo %f
答案:
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
********************清楚了,for跳过前2行,然后开始读取数据。简单。
其中tokens=* 指的是整行。如果是tokens=2,指的就是每行的第2段。
-----附原文-m.txt---------------------------------
r 这是 注释
r 这行的下面 就是正文了
d 11 d 12 d 13 d 14 d
d 21 d 22 d 23 d 24 d
d 31 d 32 d 33 d 34 d
--------------------------------------
---------------------------------------------------------------------------第四部分完
未完待续。
2009-2-11 zunyi by zwd今天不想写了。那天兴趣来了在写
翻译---sikp跳跃,delims---define limit定义界限,eol---end of line(说明:eol解释由版主HAT提供。谢谢)不运行之意思,tokens--吸取,d----directory=dir目录,f---file,r---tree树,指目录树
--------------------------------------------------------------------第五部分
###############################
for中的参数扩展练习 %~t等
###############################
1) for %t in ("123456") do @echo %t
答案:
"123456"
***********
2) for %t in ("123456") do @echo %~t
答案:
123456
*******注明:原来%~t是删除引号的意思,要注意第一个参数要写成%t,
for是扩展了%t的含意。叫扩展很贴切。
3)for %t in (123456) do @echo %~t
答案:
123456
***************原来没有引号时,%~t和%t是一样的
4) for %t in (d:\1\hehe\hehe.txt) do @echo %~ft
答案:
d:\1\hehe\hehe.txt
******************这里的文件夹1 ,不必真实的存在,可以随便输入。
%~ft中的f是filename之意。就是说要筛选出直达filename的路径
5) for %t in (d:\1\my\my.txt) do @echo %~dt
答案:
d:
************* %~dt中的d是drive之意。是筛选出驱动器之意。
6) for %t in (d:\1\my\my.txt) do @echo %~pt
答案:
\1\my\
*********p就是path,即路径的意思。不过这里的路径和通常不一样。是指
平时那种完全路径去掉两头,剩下的部分。
7)for %t in (d:\1\my\my.txt) do @echo %~nt
答案:
my
************这里的n为name,即文件名字的意思。
本句就是筛选出文件名。
8) for %t in (d:\1\my\my.txt) do @echo %~xt
答案:
.txt
*********x就是取自extend中的x,extend意思是扩展。这里指的是文件扩展名。
9)已知:d:\1\a\a.txt,其中a.txt的属性是:存档文件,系统文件
for %t in (d:\1\a\a.txt) do @echo %~at
答案:
---a-s------
***********
注明: %~at中的a来自单词attribute是属性的意思。
答案中的a是archive存档文件的意思,答案中的s是system即是系统文件的意思
10)for %k in (d:\1\a\a.txt) do @echo %~tk
答案:
2009-02-14 09:00
*****************%~tk中的t来自time,即指文件创建的时间
11) for %k in (d:\1\a\a.txt) do @echo %~zk
答案:
24
************ %~zk的z来自size,指的是文件大小为24k
---------------------------------------------------------------------------第五部分完
---------------------------------------------------------------------------第六部分
###################
练习 参数 %~$path:k% 留下买路(path)钱($美元 钱啊)
###################
1) for %k in (notepad.exe) do @echo %~$path:k
答案:
c:\windows\systeme32\notepad.exe
******************************
注明:在cmd中输入set 回车,你会看到系统设置的环境变量。这其中就有一个
是path环境变量。你可以通过桌面上我的电脑--属性---高级 去添加永久的环境变量。如果你用set直接设置环境变量的话,关闭cmd,你设置的环境变量就消失了。参数 %~$path:k只可以添加的是系统设置的环境变量中具有的字符串。也就是你在cmd中输入set后看到的那些path环境变量后面的字符串。
由于 notepad.exe文件存放的路径是
c:\windows\systeme32\notepad.exe
又由于 path环境变量里面含有字符串
path=c:\windows\systeme32;.............................
这两个条件都具备时,就会得到上面的答案。
~~~~~附注:%~$path:k% 这个符号的意思就是 k 拿着美元找 环境变量path买路啦
所以 就叫留下买路钱了。~~~~~~~~~~
╭︿︿︿╮
{/ o o /}
( (oo) )
︶ ︶︶
下面做个对比练习
2) 第一步
查看path环境变量,在cmd中运行 path 回车 你就看到了path环境变量
接下来重新设置path环境变量
在cmd中运行: set path=d:\
不要关闭cmd
第二步
重新查看一下path环境变量,运行path 回车,此时你会发现path环境变量后面的字符串变了,你看到这时的path环境变量在内存里面变成了 paht=d:\
第三步
再运行 1)题中的语句
for %k in (notepad.exe) do @echo %~$path:k
结果是:
ECHO 处于打开状态
***************
这说明path环境变量变了,notepad.exe无法被%~$path:k 扩展为一个合格的路径了。即系统找不到程序notepad.exe的路径了。
这是因为
notepad的真实路径是c:\windows\systeme32\notepad.exe
而 %~$path:k 参数要利用path环境变量把路径添加(扩展,或叫扩充)到notepad.exe的前面去。但是但是path环境变量里面没有notepad的真实路径啊,所以最后就只能是扩展失败!
为了证明上面的说法,继续练习
3)已知:d:\1\n.bat,其中n.bat的内容如下:
----------------------------
@echo dddddd
-------------------------
第一步
在cmd中运行:
for %k in (n.bat) do %~$path:k
结果如下:
空的什么都没有
***************就是无法扩充路径的意思
再运行for %k in (n.bat) do @echo %~$path:k
看看是什么
答案:
ECHO处于打开状态
*********************这就是说扩充路径失败了。
不要关闭cmd
第二步
运行 set path=d:\1\ 回车(也可以运行的是path=d:\1\ 效果一样)
第三部
运行 path 回车 ,此时你讲看到path路径成为了你设置的路径了。
第四步
先运行下面的语句
for %k in (n.bat) do %~$path:k
答案:
dddddd
*********
再运行下面的语句
for %k in (n.bat) do @echo %~$path:k
答案:
d:\1\n.bat
************
4) usebackq举例
for /f %1 in ('dir') do %1
答案:
dir显示的结果,什么卷标啊,时间啊,for把那些东西当命令运行了
****************************************************因为这时for要运行的是 dir显示出来的结果,那些东西是命令吗?不是。
5) for /f "tokens=* " %1 in ("dir d:") do %1
答案:
会显示d盘的目录
****************此时for把“dir d: "理解为 dir d:来执行
6) for /f "usebackq tokens=* " %1 in ('dir d: ') do %1
答案:
会显示d盘目录,结果同上。
************************这就是说,usebackq是指要执行单引号扩起来的命令。即单引号扩起来的命令要让它执行就要用到usebackq
7) 抓去文本内的命令
已知:d:\m.txt,其内容如下:
----------------------------
echo 123456
----------------------------------
第一步,运行
for /f "tokens=* " %1 in ("d:\m.txt") do %1
结果:
你将打开记事本文件 m.txt
********************这说明for并没有读取m.txt里面的命令
第二步,运行
for /f "tokens=* usebackq " %1 in ("d:\m.txt") do %1
结果:
123456
********这说明for读取的是m.txt里面的命令,并执行了它。
总结
for /f %1 in (d:\my.txt) do %1
这里的%1指的是my.txt里面的内容,for要执行的是里面的命令,这是for /f 里面的参数和普通参数刚好相反的地方,是for /f 的关键
for /f 的默认就是加载文本里面的内容。不过for还有一种隐含式加载文本的方法
那就是通过命令加载文本
如:for /f %1 in (‘dir’) do %1
for执行的过程是这样的,首先运行dir 命令,将显示C盘的目录和卷标,这些显示出来的内容
for就把它当做要加载的文本。%1就执行这些文本,但是这是盘符啊,卷标啊,又不是命令,哪能执行啊,所以最后不报错才怪。
如果你要改变默认 就用引号吧,如果你又要回到默认可不能用引号引号了,而该用usebackq了(使用返回退出use back quit)吧。
下面就来继续分析一下 for /f 与 usebackq的含义
1--for /f 是加载文本文件里面的命令的意思,它加载文本文件的方式
分为隐藏式加载和显示加载,理解这点及其重要。
如:for /f %1 in (d:\my.txt) do %1
这句话就是让for加载my.txt里面的命令,此时%1代表的不是“ d:\my.txt”
而是它里面的命令!!!!----这种直白的加载文本,
我给它取名叫显示加载。
又如:for /f %1 in ('dir') do %1
for 是按下列过程运行的
首先机器解释dir命令,把dir的结果,看成是一个要加载的文本
然后,for /f 就加载它理解的这个文本,但是dir的结果形成的
文本根本就不是命令,所以cmd会报错。---这种可以叫隐藏式加载
文本。特点是 用单引号把命令引起来。
2--usebackq的理解
首先usebackq只用在in 后面 有单,双引号的地方,
对在in 后面没有引号的地方不起作用。
如:for /f %1 in ("d:\my.txt") do %1这句是打开文本my.txt,不是加载文本内容,
如果改为 for /f "usebackq" %1 in ("d:\my.txt") do %1,
这句就变成了要加载文本里面的内容的意思了。这等价于
for /f %1 in (d:\my.txt) do %1
又如:for /f %1 in ('dir') do %1 这句是加载dir产生的文本内容。
如果改为:for /f "usebackq" %1 in ('dir') do %1
就变成了值执行命令dir,而不会把命令的结果当文本加载。
所以usebackq只用在有引号的地方,没引号的地方用了等于没用。
其作用是-------改反语句
usebackq就是use back quit 使用返回退出。
--------------------------------------------------------------------------------------第六部分完
::.--.-.::
:( ( )::::: 东边日出西边雨
(_, \ ) ,_):: 道是无晴却有情 |
:::-'--`--:::::::: ~~| , \ _ /
::::::::::::::::::: ,|`-._/| -== (_) ==-
::::::::^^::::::::.' | /||\ / \
::::::^^::::::::.' | ./ ||`\ |
:::::::::::::::/ `-. |/._ || \
::::::::::::::| || || \
~~=~_~^~ =~ \~~~~~~~'~~~~'~~~~/~~`` ~=~^~
~^^~~-=~^~ ^ `--------------'~^~=~^~_~^=~^~
结束语
到此全文完,如果有不当之处,请指出。2009-2-14 zunyi by zwd
1---for /f 语句在理解时,把文本里面的内容理解位一个数组是比较恰当的。数组就是数学中的矩阵。更通俗的讲,就是你读书时代的那种课表的样子。课表被划分为段,这里是利用delims来定义如何划分段的。而tokens是让你的参数%1,指向对应的段,eol是注释掉数组中的行,skip是让%1跳过数组里面的前几行。usebackq是在in含有单双引号时,让%1走向默认的反面。
[ Last edited by 5yue5 on 2009-2-22 at 16:53 ]
for /r d:\ %f (*) do @echo %f
for /r d:\ %f (.) do @echo %f (只显示目录)
for /l %f (10,-2,1) do @echo %f (等差数列的首项是10,公差是-2)
少了 in 吧...