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
---------------------
已知: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) )
︶ ︶︶
第三步
再运行 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
第二步,运行
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 使用返回退出。
end of line
但是实际就不执行 那行。所以就是结束,停此执行哪一行之意了。
也就相当于 rem。
不过你的解释非常好,我的确没想出是这个意思,呵呵。谢谢。
[ Last edited by 5yue5 on 2009-2-12 at 23:05 ]作者: solid 时间: 2009-2-13 00:35 很好的练习题作者: qq43142691 时间: 2009-2-13 04:32 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)
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.