中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: for命令的疑惑! 上一主题 | 下一主题
shtcool
初级用户





积分 49
发帖 20
注册 2007-10-23
状态 离线
『楼 主』:  for命令的疑惑!

以前随便写的一个练习,主要是ping局域网机器
@del reply.txt >nul 2>nul
@for /l %%i in (1,1,10) do ping -n 1 192.168.1.%%i | @find "Reply" >> reply.txt
@for /f "tokens=3  delims=: " %%a in (reply.txt ) do @echo 连接ip地址%%a成功! >> reply.txt
以上命令太繁琐,今天想改成如下命令, 自己分析命令行应该没有错,但总报错:
for /f "tokens=3  delims=: " %%a in (' for /l %%i in (1,1,10) do ping -n 1 192.168.1.%%i ^| find /I "Reply" ') do echo 连接ip地址%%a成功!
pause >nul
上面到底是哪里错了,还是根本就不能这样写?请大家帮忙看看,谢谢!
要求先执行外层for语句IN里面的('for /l %%i in (1,1,10) do ping -n 1 192.168.1.%%i ^| find /I "Reply"')这个命令然后在执行外面for /f "tokens=3  delims=: " %%a in ('  ') do echo 连接ip地址%%a成功!这个命令!是不是不能这样嵌套用?

[ Last edited by shtcool on 2007-11-12 at 03:12 PM ]

2007-11-12 12:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
junchen2
高级用户





积分 537
发帖 219
注册 2007-8-4
来自 杭州--半山
状态 离线
『第 2 楼』:  

echo off
@for /l %%a in (0 1 255) do ping -n 1 192.168.1.%%a |find /i "reply"&&echo 能PING通
pause

2007-11-12 12:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
shtcool
初级用户





积分 49
发帖 20
注册 2007-10-23
状态 离线
『第 3 楼』:  

谢谢2楼的,我的问题是要求先执行外层for语句IN里面的('for /l %%i in (1,1,10) do ping -n 1 192.168.1.%%i ^| find /I "Reply"')这个命令然后在执行外面for /f "tokens=3  delims=: " %%a in ('  ') do echo 连接ip地址%%a成功!这个命令!是不是不能这样嵌套用?

[ Last edited by shtcool on 2007-11-12 at 03:12 PM ]

2007-11-12 15:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  

可以嵌套,不过in里面的for的括号需要转义一下。

  Quote:
for /f "tokens=3  delims=: " %%a in (' for /l %%i in ^(1,1,10^) do ping -n 1 192.168.1.%%i ^| find /I "Reply" ') do echo 连接ip地址%%a成功!



2007-11-12 17:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
shtcool
初级用户





积分 49
发帖 20
注册 2007-10-23
状态 离线
『第 5 楼』:  

非常感谢LXMXN版主的帮助,原来的程序只想着把管道命令转义而忽略了()的转义,造成程序不能运行,还是太菜了,非常感谢。程序现在能运行了,唯一不足的是PING不通的机器命令回显会是:连接ip地址and成功!
不知道这个and字符是哪里来的怎么会给变量%%a赋成了这个值?按理说find命令找不到“reply”,echo %%a会不回显,让它不回显是不是还要加上判断语句?

2007-11-13 12:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 6 楼』:  

这样试试:
for /f "tokens=3  delims=: " %%a in (' for /l %%i in ^(1,1,10^) do ^(@ping -n 1 192.168.1.%%i ^| find /I "Reply" ^)') do echo 连接ip地址%%a成功!


2007-11-13 13:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
shtcool
初级用户





积分 49
发帖 20
注册 2007-10-23
状态 离线
『第 7 楼』:  

问题解决,谢谢版主!有个疑问就是如果命令直接写成:for /f "tokens=3  delims=: " %%a in (' for /l %%i in ^(1,1,10^) do ping -n 1 192.168.1.%%i ^| find /I "Reply" ') do echo 连接ip地址%%a成功! 那么会发现在桌面的运行此脚本时会出现and字符,直接copy在命令提示符下运行仔细观察发现在此命令预处理时会把cmd命令窗口里的C:\Documents and Settings\Administrator里面的and字符也分割提取了,造成结果为:
and
192.168.1.1
and
.....
但把此批处理copy到c盘下运行,一切正常!
最后把此命令ping -n 1 192.168.1.%%i的前面加上@在桌面运行就正常了,xp和2003都测试通过,疑问就是加上了@(隐藏命令行本身的回显)为何就可以?真不懂了。
呵呵,原来还想精简程序,没想到越写越复杂!
最后终于改好成如下:
@setlocal enabledelayedexpansion
@for /f  "tokens=3  delims=: " %%a in (' for /l %%i in ^(1,1,2^) do @ping -n 1 192.168.1.%%i ^| find /I "Reply" ') do set p=%%a && echo !p! ok !>>reply.txt
@start reply.txt
goto:eof

[ Last edited by shtcool on 2007-11-13 at 07:16 PM ]

2007-11-13 18:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
genteman
初级用户





积分 90
发帖 43
注册 2007-10-31
状态 离线
『第 8 楼』:  

楼主你忘了' for /l %%i in ^(1,1,10^) do ping -n 1 192.168.1.%%i ^| find /I "Reply" '是一个集合,
for肯定也要去提取的,对于外层的for来说,()中的每一行它都要去处理的。

2007-11-13 18:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
shtcool
初级用户





积分 49
发帖 20
注册 2007-10-23
状态 离线
『第 9 楼』:  

谢谢8楼的,呵呵,下次这个问题我一定会注意。还有一个问题就是如果此命令:
@for /f  "tokens=3  delims=: " %%a in (' for /l %%i in ^(1,1,2^) do ping -n 1 192.168.1.%%i ^| find /I "Reply" ') do set p=%%a && echo !p! ok !>>reply.txt
do ping -n 1 192.168.1.%%i的前面不加@会发现在桌面运行后会是(就算加上@echo off):
and ok
192.168.1.1 ok
and ok

如果改成:do @ping -n 1 192.168.1.%%i命令就成功运行了,是何原因?

[ Last edited by shtcool on 2007-11-13 at 07:27 PM ]

2007-11-13 19:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
r0gue
新手上路





积分 7
发帖 4
注册 2007-11-13
状态 离线
『第 10 楼』:  

学习了,正愁for命令不知道如何用呢

2007-11-13 23:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
genteman
初级用户





积分 90
发帖 43
注册 2007-10-31
状态 离线
『第 11 楼』:  

ping -n 1 192.168.1.%%i ^| find /I "Reply"
上面这句是一个完整的命令,你在执行的时候windows是启用了新的CMD环境来运行,上面这句运行的结果是是下面这样:
C:\Documents and Settings\Administrator\ping -n 1 192.168.1.%%i ^| find /I "Reply"
Reply from 192.168.1.1: bytes=32 time<1ms TTL=128
C:\Documents and Settings\Administrator\
外层的for对上面几行都要去解析,你的delims=:.,.代表空格,如果tokens=1-3,那么取出来的数值会是%%a=C, %%b=\Documents,%%c=and,你的tokens=3,所以最后打印出来and就是理所当然的事了。

批处理添加@echo off也是针对当前的命令行环境,对新的命令行环境不起作用

2007-11-14 10:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
shtcool
初级用户





积分 49
发帖 20
注册 2007-10-23
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by genteman at 2007-11-14 10:28 AM:
ping -n 1 192.168.1.%%i ^| find /I "Reply"
上面这句是一个完整的命令,你在执行的时候windows是启用了新的CMD环境来运行,上面这句运行的结果是是下面 ...

十分感谢,光会使用命令,而不懂命令脚本解析顺序,难成大器!非常感谢!

2007-11-14 15:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zwgxsy
初级用户





积分 66
发帖 32
注册 2007-10-23
状态 离线
『第 13 楼』:  

我也遇到了同样问题,搜索了半天,终于看到了,试试.  :)

2007-11-15 15:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 14 楼』:  

有点愚钝,学了

2007-11-15 21:03
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: