中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 关于FOR /L 的一个问题,请高手指点!
作者:
标题: 关于FOR /L 的一个问题,请高手指点! 上一主题 | 下一主题
sy790825
新手上路





积分 11
发帖 5
注册 2007-5-16
状态 离线
『楼 主』:  关于FOR /L 的一个问题,请高手指点!

批处理文件内容
for /L %%a in (1,1,254) do call ping.bat %%a
目的:想写个打开254个窗口,执行ping.bat,用变量%%a,作为ping.bat的参数,问题是现在只执行第一个%%a,就是1,而不会递增到255,是不是for /L,不支持call bat文件?用for / f 就没有问题!

还有个问题:命令ping 192.168.0.1 | findstr "Relpy" >nul ,在dos下直接执行正常,如果写在批处理下,就会显示成ping 192.168.1.1   | findstr "Reply"  1>nul
,请教多出来的1是怎么回事,请高手指点,先谢谢啦!!

2008-1-12 12:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ywjco
初级用户





积分 31
发帖 17
注册 2007-10-31
状态 离线
『第 2 楼』:  

第一个:
for /L %%a in (1,1,254) do call ping.bat %%a要想在循环中引用变量, 需要使用变量廷迟扩展:
***************************
@echo off

setlocal EnableDelayedExpansion
set /a n=0
for /L %%a in (1,1,254) do  (
      set /a n=%%a
      ::echo !n! in Main_bat
      call ping.bat !n!
)
pause

*********************************
第二个:
1>nul中的1是STDOU, 即XP CMD的命令行窗口. 是因为你在BAT中使用了重定向(即把标准输出重定向到nul设备中),用@echo off 可关闭其显示, 并不影响BAT的执行.

以上在XP SP2 CMD下测试.:P

[ Last edited by ywjco on 2008-1-12 at 11:11 PM ]

2008-1-12 23:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




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

把“call”改成“start”。

2008-1-13 00:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dby55
初级用户





积分 98
发帖 49
注册 2007-5-1
状态 离线
『第 4 楼』:  

又学到知识了

2008-1-13 06:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sy790825
新手上路





积分 11
发帖 5
注册 2007-5-16
状态 离线
『第 5 楼』:  感谢各位英雄指点,呵呵!

3楼的start曾经试过,结果弹出无数窗口,直接死机?不知为何,call也是,即使只循环2次也是,,有谁知道原因?
2楼的感觉正解,不过请教一下,为何需添加变量N,延时我理解,直接%%a,不可以么?比如我直接each %%a显示的不是从1-255,为什么要set N,还有STDOU,是什么意思,可以解释一下么,非常感谢!

2008-1-13 18:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ywjco
初级用户





积分 31
发帖 17
注册 2007-10-31
状态 离线
『第 6 楼』:  

TO:第 3 楼
版主lxmxn这次是失手了。
MS的参考:

Start启动单独的“命令提示符”窗口来运行指定程序或命令。如果在没有参数的情况下使用,start 将打开第二个命令提示符窗口。

加上参数/b :启动应用程序时不必打开新的“命令提示符”窗口。
我是死机了一次再来查看的,大意了。
********************************
TO :第 5 楼
有关重定向的问题请查阅MS的帮助:
开始--->运行-->输入:  hh ntcmds.chm::/redirection.htm
使用命令重定向操作符

我贴出部分:
默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。

下表将列出可用的句柄。

句柄         句柄的数字代号            说明
STDIN         0                             键盘输入
STDOUT      1                            输出到命令提示符窗口
STDERR       2                            错误输出到命令提示符窗口
UNDEFINED 3-9                          这些句柄由应用程序和各个具体工具单独定义。

默认的 > 重定向输出操作符是 1

有关使用变量N,请参考论坛中的教程:
http://bbs.verybat.cn/viewthread.php?tid=6476&extra=page%3D1

批处理基础系列第八集
主    题:延迟环境变量扩展

[ Last edited by ywjco on 2008-1-14 at 10:27 PM ]

2008-1-14 20:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xhm
新手上路





积分 6
发帖 2
注册 2008-1-16
状态 离线
『第 7 楼』:  

学到东西了

2008-1-16 23:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




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

你觉得启用变量延迟有用么?这里根本就是多余的操作。

我说把“call”改称“start”可能说简单了,但是还是用“start”的方法来就可以了。

试试这个:
for /L %%a in (1,1,255) do start cmd /c ping.bat %%a
另外,建议楼主不要把批处理脚本的名字写成系统已有命令的名字,比如这里的“ping.bat”就不合适,避免造成不必要的麻烦。

2008-1-16 23:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sy790825
新手上路





积分 11
发帖 5
注册 2007-5-16
状态 离线
『第 9 楼』:  

呵呵,受教了,感谢lxmxn与ywjco耐心指点!解决我想了很久的问题,thank you very mach!!!

2008-1-17 13:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ywjco
初级用户





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

TO:lxmxn版主

大量使用start cmd /c这样调用子批处理会导致额外的系统开销,虽然用cmd /c参数会每次自行结束CMD窗口,但调用时系统硬盘还是狂跑一轮;相比之下,使用用“廷迟变量扩展”调用子批处理,就可以完全解决此问题。其好处是,每次均在本批处理中调用ping.bat,没有额外的CMD窗口内存开销。

若要查看这两者的差别,只要在执行这两个批处理之前,用Ctrl-Alt-Del 开启任务管理器,然后将for /L %%a in (1,1,255)中的255改为512或更大时,分别进行测试,就清楚了。

仅作学习讨论。

2008-1-17 20:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




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



  Quote:
目的:想写个打开254个窗口

这里我并不是讨论效率的问题,而是讨论怎么达到楼主说的这个效果。

2008-1-17 22:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xjhdos
初级用户





积分 46
发帖 24
注册 2008-4-10
来自 湖北
状态 离线
『第 12 楼』:  

<font color=#FF0CF9>郁</font><font color=#FF18F3>闷</font><font color=#FF24ED>啊</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#FF6DC9>怎</font><font color=#FF79C3>么</font><font color=#FF86BC>弄</font><font color=#FF92B6>的</font><font color=#FF9EB0>呀</font>&nbsp;&nbsp;&nbsp;<font color=#FFCE98>不</font><font color=#FFDB92>是</font><font color=#FFE78C>太</font><font color=#FFF386>会</font><font color=#FFFF80>呀</font>

2008-4-11 05:47
查看资料  发送邮件  发短消息 网志  OICQ (724510024)  编辑帖子  回复  引用回复
11440
新手上路





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

把“call”改成“start”。
版主厉害

2008-4-11 15:09
查看资料  发送邮件  发短消息 网志  OICQ (250915642)  编辑帖子  回复  引用回复
lfopt
初级用户





积分 71
发帖 34
注册 2008-3-12
状态 离线
『第 14 楼』:  

用"start"NB,我喜欢

2008-4-12 20:43
查看资料  发送邮件  发短消息 网志  OICQ (343253490)  编辑帖子  回复  引用回复

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


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



论坛跳转: