|
5yue5
初级用户
积分 69
发帖 34
注册 2009-2-8
状态 离线
|
『楼 主』:
for/f 练习---做完这几个练习,不懂for/f 都不行
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 ]
|
|
2009-2-12 18:38 |
|
|
HAT
版主
积分 9023
发帖 5017
注册 2007-5-31
状态 离线
|
『第
2 楼』:
eol 是 end of line 的缩写吧?
|
|
|
2009-2-12 20:58 |
|
|
pujihong123
初级用户
积分 47
发帖 27
注册 2008-6-23 来自 甘肃. 武威
状态 离线
|
『第
3 楼』:
看了下下似乎没看懂是什么意思!
|
好好学习,
天天向上。 |
|
2009-2-12 21:18 |
|
|
5yue5
初级用户
积分 69
发帖 34
注册 2009-2-8
状态 离线
|
『第
4 楼』:
这是做的 不是看的
叫练习 做了就明白。
不做就是一头雾水。
|
|
2009-2-12 22:54 |
|
|
5yue5
初级用户
积分 69
发帖 34
注册 2009-2-8
状态 离线
|
『第
5 楼』:
你说的ok
end of line
但是实际就不执行 那行。所以就是结束,停此执行哪一行之意了。
也就相当于 rem。
不过你的解释非常好,我的确没想出是这个意思,呵呵。谢谢。
[ Last edited by 5yue5 on 2009-2-12 at 23:05 ]
|
|
2009-2-12 22:59 |
|
|
solid
新手上路
积分 18
发帖 10
注册 2009-1-23
状态 离线
|
|
2009-2-13 00:35 |
|
|
qq43142691
中级用户
积分 327
发帖 152
注册 2007-5-4
状态 离线
|
『第
7 楼』:
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 吧...
|
|
2009-2-13 04:32 |
|
|
5yue5
初级用户
积分 69
发帖 34
注册 2009-2-8
状态 离线
|
『第
8 楼』:
谢谢
是掉了 in 我补上了
http://technet.microsoft.com/en-us/library/bb490909.aspx
The filenameset argument specifies one or more file names. Each file is opened, read and processed before going on to the next file in filenameset. To override the default parsing behavior, specify "ParsingKeywords". This is a quoted string that contains one or more keywords to specify different parsing options.
If you use the usebackq option, use one of the following syntaxes:
for /F ["usebackqParsingKeywords"] {%% | %}variable in ("filenameset") do command [CommandLineOptions]
for /F ["usebackqParsingKeywords"] {%% | %}variable in ('LiteralString') do command [CommandLineOptions]
for /F ["usebackqParsingKeywords"] {%% | %}variable in (`command`) do command [CommandLineOptions]
The following table lists the parsing keywords that you can use for ParsingKeywords.
以上是来自微软的官方网站的原文,从这里可以看出usebackq就是废除默认强调的意思。
[ Last edited by 5yue5 on 2009-2-24 at 19:00 ]
|
|
2009-2-13 15:21 |
|