标题: [其他] [已解决]解释批处理for语句的各种用法 [打印本页]
作者: sihonghong20061 时间: 2008-7-31 15:22 标题: [已解决]解释批处理for语句的各种用法
FOR /F ["options"] %%i IN (file) DO command
FOR /F ["options"] %%i IN ("string") DO command
FOR /F ["options"] %%i IN ('command') DO command 都有点不懂 呵呵 特别是 FOR /F [ options ] %%i IN ('command') DO command 中的'command' 还有单引号 顺便举些例子吧 在线等呢 谢谢 啊 对了还有for/d 我看了很 多贴 说的不明白 最好有例子
作者: sihonghong20061 时间: 2008-7-31 16:18
没人啊 o(∩_∩)o...
作者: more 时间: 2008-7-31 16:51
在批处理中 for 是最难懂的命令了,刚注册一天就问这种问题是很不理智的,要多看别人的代码,然后分析代码的运行过程,看它是如何实现的,看不懂的话,去掉echo off再分析,还不清楚的话再到论坛发帖子求助,我相信大家都很乐意帮你的,凭空举例不好弄
作者: pusofalse 时间: 2008-7-31 19:36
建议先搜索一下,一下for的通俗讲解。^_^
http://bbs.bathome.net/viewthread.php?tid=9&extra=page%3D2
作者: ieutk 时间: 2008-8-1 00:18
- @echo off
-
- rem 在FOR /F ["options"] %%i IN 语句中,IN后面括号中如果为文件则不用引号
- for /f "delims=" %%a in (%0) do type %%a
-
-
- rem 在FOR /F ["options"] %%i IN 语句中,IN后面括号中如果为字符则要用双引号引起来
- for /f "delims=" %%a in ("abcd") do echo %%a
-
-
- rem 在FOR /F ["options"] %%i IN 语句中,IN后面括号中如果为命令则要用单引号引起来
- for /f "delims=" %%a in ('type %0') do echo %%a
- pause
复制代码
作者: null 时间: 2008-8-1 00:33
- FOR /F ["options"] %%i IN ("string") DO command
-
- for /f "tokens=1 delims= " %%i in ("help you") do @echo %%i
- pause>nul
复制代码
作者: null 时间: 2008-8-1 00:37
- FOR /F ["options"] %%i IN ('command') DO command
-
- for /f "tokens=2 delims=:" %%i in ('ipconfig /all^|findstr /c:"IP Address"') do @echo %%i
复制代码
第一个就不举例说明了。
作者: sihonghong20061 时间: 2008-8-1 08:35 标题: 回复 4楼 的帖子
先谢谢哦 但是还是有点不懂 'ipconfig /all^|findstr /c:"IP Address"' 中的^有什么作用 为什么没有就不行呢 希望告诉小弟一下 谢谢了
作者: sihonghong20061 时间: 2008-8-1 08:38
哦 我现在明白了FOR /F ["options"] %%i IN ('command') DO command 但是还是有点不懂 'ipconfig /all^|findstr /c:"IP Address"' 中的^有什么作用 为什么没有就不行呢 希望告诉小弟一下 谢谢了
作者: null 时间: 2008-8-1 10:42
'ipconfig /all^|findstr /c:"IP Address"'
^是转义符
用在特殊符号之前
比如:
echo 批处理^&家
如果不加^ 那么"家"将被当作命令执行,这样就会报错
作者: sihonghong20061 时间: 2008-8-1 11:01 标题: 回复 12楼 的帖子
这知道啊 问题是'ipconfig /all^|findstr /c:"IP Address"' 中的|是管道命令啊 为什么还要加^ 呢 还是谢谢你的回答
作者: pusofalse 时间: 2008-8-1 12:27
- -||||||||||
应该先自己思考一番,能深切体会到思考的快乐。
for的('')中的特殊字符前必须要用^对其转义。
此处的特殊字符为命令连接符。| || & && > >>等等。。。
作者: sihonghong20061 时间: 2008-8-1 14:53 标题: 回复 14楼 的帖子
哦 谢谢诶 明白了 我已经思考了 就是想不通 为什么 给你添麻烦了 o(∩_∩)o...
作者: sihonghong20061 时间: 2008-8-1 14:58 标题: 回复 14楼 的帖子
还有问一下 版主 是不是只有for的('')中的特殊字符前必须要用^对其转义 我看过^不是在要输出特殊字符才用^ 这里用的| 是管道命令 又怎么会用^呢 帮忙说一下 吧
作者: springcm 时间: 2008-8-1 16:58 标题: 回复 15楼 的帖子
CN-dos:- 自己总结关于FOR /F中usebackq的用法
- 先来说一下我cmd的当前目录中放有
-
- ab.txt (里面写着file:ab.txt)
- a b.txt(里面写着b.txtfile:a (space) b.txt)
-
- 首先我们来看看,for中不采用usebackq时的情况
- @FOR /F "tokens=*" %i IN (ab.txt) DO @ECHO %i
- 结果:file:ab.txt
- @FOR /F "tokens=*" %i IN (a b.txt) DO @ECHO %i
- 结果:系统找不到文件 a
-
- 总结:(IN后面的,下同)括号中的文字不加东西
- (这里的东西指双引号,单引号,还有back quoted,)时,指的是文件,但文件中不能有空格,否则就会出错。
- @FOR /F "tokens=*" %i IN ('ECHO Hello') DO @ECHO %i
- 结果:Hello
- 总结:这里结果是hello表示这里的ECHO应该是当作一个命令来执行的,即把ECHO Hello的结果传给%i
- @FOR /F "tokens=*" %i IN ("ECHO Hello") DO @ECHO %i
- 结果:ECHO Hello
-
- 总结:这个结果的ECHO Hello,表明这里的echo 不是当作dos中的命令来处理,而是当作字符来处理。
- @FOR /F "tokens=*" %i IN (`ECHO Hello`) DO @ECHO %i
- 结果:系统找不到文件 `ECHO。
-
- 说明关于这个例子,你也许会认为和第二个相同,如果你仔细看的话会发现有一点不同,这个用的是back quoted。你可以先暂时跳
- 过这个,等看完下面的在回来看这个。
-
- 下面看看使用usebackq的效果:
- 在做下面实验以前先做一些准备工作,首先我把cmd /?中关于usebackq部分拷过来。
- Quote:
- specifies that the new semantics are in force,
- where a back quoted string is executed as a
- command and a single quoted string is a
- literal string command and allows the use of
- double quotes to quote file names in
- filenameset.
- 看到这个帮助,我认为这里讲了usebackq的三种用法,单引号,双引号,back quote.在下面的实验中我会一个一个来讲的。(注意区分单引号和back quote)
- 例1.
- @FOR /F "usebackq tokens=*" %i IN (ab.txt) DO @ECHO %i
- 结果:file:ab.txt
- @FOR /F "usebackq tokens=*" %i IN (a b.txt) DO @ECHO %i
- 例2.
- 结果:系统找不到文件 a。
- 总结:括号中文字不加东西时,与不使用usebackq的作用是相同(参考例1,例2):即都表示的是文件,但文件中不能有空格,否则就会出错。
- 到了这里也许会有人想,如果我的文件里面有空格该怎么办呢?下面的这个实验,就会帮你解决这个问题.
- 例3.
- @FOR /F "usebackq tokens=*" %i IN ("a b.txt") DO @ECHO %i
- 结果:file:a (space) b.txt
- 总结:当使用usebackq这个关键字之后,双引号中的文字不在代表字符串(参见例3),而且代表文件名了。即使文件中有空格也可以使用。
- 那么当使用usebackq关键字之后,但又想使用字符串,要该么办,其实这时是用单引号来代表字符串。看下面的实验。
- @FOR /F "usebackq tokens=*" %i IN ('ECHO hello') DO @ECHO %i
- 结果:ECHO hello
- 总结:这个和实验四的结果一样,证明了,单引号里面的是字符串。
- @FOR /F "usebackq tokens=*" %i IN (`ECHO hello`) DO @ECHO %i
- 结果:hello
- 注意了这里不是单引号,而是back quote,这个结果说明,当使用back quote时里面的是命令。也就相当于不使用usebackq关键字的
- 单引号。当然,如果你可以把Echo hello其它dos命令,把执行的结果传给%i,如果你输入的不是dos命令,比如abc Hello,cmd会提
- 示你abc不是命令。
复制代码
作者: pusofalse 时间: 2008-8-1 20:44 标题: 以下转载,LXMXN版主贴,符号的用法。
复制代码
作者: sihonghong20061 时间: 2008-8-1 21:13 标题: 回复 18楼 的帖子
版主你好 你好像还是没回答到点上啊 那贴我都已经看过了 也明白了不少 呵呵
还是问一下 是不是只有for的('')中的特殊字符前必须要用^对其转义 我看过^不是在要输出特殊字符才用^ 这里用的| 是管道命令 又怎么会用^呢 帮忙说一下 吧
作者: pusofalse 时间: 2008-8-2 04:37
原帖由 sihonghong20061 于 2008-8-1 21:13 发表
版主你好 你好像还是没回答到点上啊 那贴我都已经看过了 也明白了不少 呵呵
还是问一下 是不是只有for的('')中的特殊字符前必须要用^对其转义 我看过^不是在要输出特殊字符才用^ 这里用的| 是管道命令 又怎 ...
你知道的,|的作用是连接两条命令,把第一条命令的结果作为第二条命令的参数,先加深一下印象:
echo abcdef|findstr "a"
在echo abcdef命令的输出结果中查找字符a。
我这样解释给你好了,拿Null的例子来说。
for /f "tokens=2 delims=:" %%i in ('ipconfig /all|findstr /c:"IP Address"') do @echo %%i
for的集合中没有用^对|转义,而出错,为何出错呢?
这是因为被系统误认为|之前的第一条命令是所有的红色部分,而不是集合中的ipconfig/all ,第二条命令是所有的蓝色部分,而不是findstr /c:"IP Address"'
for /f "tokens=2 delims=:" %%i in ('ipconfig /all
你能告诉我这条命令是什么意思吗?
你肯定会说这不是一条完整的命令,既然不是完整的命令了,当然出错。所以必须加^对|转义,它连接的只是ipconfig/all和findstr /c:"IP Address"
其他的& && || > >>同样道理。
作者: sihonghong20061 时间: 2008-8-2 09:27 标题: 回复 20楼 的帖子
哦 谢谢诶 版主 呵呵 明白了 非常谢谢
作者: jiasongfu 时间: 2009-9-24 16:20
^|的作用
版主的回答太好了,我在网上找了几天,今天是终于明白了,谢谢,非常谢谢。
作者: vsbat 时间: 2009-11-3 16:00
哎---------------
版主解释的 果然 明了 啊啊---
学习啦===-
看来 还应该好好学习一下 符号---
作者: abxialiang 时间: 2010-4-19 19:24 标题: 回复 18楼 的帖子
为什么加一个^系统就知道正确的分割位置呢?转义是把特殊符号的作用消除吧,那^|中|的作用还会有吗?
作者: wc726842270 时间: 2010-10-5 13:47
这样的贴子要是沉了就太可惜了,强顶一下。另外只有在FOR中管道命令“|”才是这样?是否还有其它的符号也是这样?能否给几个例子啊?
作者: carson2013 时间: 2013-1-29 16:31
终于看到好的解决方案了。
作者: hzcxdgioa 时间: 2013-9-26 00:24
英文的句号和逗号,在批处理的命令后,具有等同于空格的效果,,,,,,,,,,,,,,
作者: hzcxdgioa 时间: 2013-9-26 00:24
英文的句号和逗号,在批处理的命令后,具有等同于空格的效果,,,,,,,,,,,,,,
作者: Nemo_zg 时间: 2014-10-17 18:13
回复 18# pusofalse
for /f "tokens=2 delims=:" %%i in ('ipconfig /all|findstr /c:"IP Address"') do @echo %%i
不太理解为什么DOS没在把''单引号包含的内容作为一整块,而还能透过前单引号看到里面的| 把它分成前面的红色和后面的蓝色两部分。
作者: CrLf 时间: 2014-10-17 20:41
回复 27# Nemo_zg
语法如此,只能去适应了,虽然我也很奇怪微软为什么不顺手实现了...
作者: GNGW 时间: 2024-3-20 10:50
本帖最后由 GNGW 于 2024-3-20 10:53 编辑
回复 18# pusofalse
我还是不明白,为什么要转义?转义的作用是将|转为普通字符吗?以及它涉及到什么机制?我也在为^^转义字符发愁,在开启延迟变量扩展之后需要用^^两个转义字符转义一个特殊字符,我对这一机制不理解,为什么?怎么回事到底发生了什么???
作者: qixiaobin0715 时间: 2024-3-20 10:57
这里的转义的作用应当是声明“|”的作用范围是在一组单引号之间,而不是将“|”转为普通字符。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |