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成功!
作者: shtcool 时间: 2007-11-13 18:21 问题解决,谢谢版主!有个疑问就是如果命令直接写成: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 ]作者: genteman 时间: 2007-11-13 18:48 楼主你忘了' for /l %%i in ^(1,1,10^) do ping -n 1 192.168.1.%%i ^| find /I "Reply" '是一个集合,
for肯定也要去提取的,对于外层的for来说,()中的每一行它都要去处理的。作者: shtcool 时间: 2007-11-13 19:26 谢谢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 ]作者: r0gue 时间: 2007-11-13 23:30 学习了,正愁for命令不知道如何用呢作者: genteman 时间: 2007-11-14 10:28 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就是理所当然的事了。