![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-08 01:39 |
共 48,041 主题排行 / 350,128 发帖 / 今日 3 篇 / 48,253 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 关于FOR /L 的一个问题,请高手指点! |
| 可打印版本 1,390 / 13 |
| 第1楼 sy790825 | 发表于 2008-01-12 12:32 |
| 新手上路 发帖 5 积分 11 | |
|
关于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是怎么回事,请高手指点,先谢谢啦!! |
|
| 第2楼 ywjco | 发表于 2008-01-12 23:07 |
| 初级用户 发帖 17 积分 31 | |
|
第一个:
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 ] |
|
| 第3楼 lxmxn | 发表于 2008-01-13 00:34 |
| 版主 发帖 4,938 积分 11,386 | |
|
把“call”改成“start”。
|
|
| 第4楼 dby55 | 发表于 2008-01-13 06:55 |
| 初级用户 发帖 49 积分 98 | |
|
又学到知识了
|
|
| 第5楼 sy790825 | 发表于 2008-01-13 18:54 |
| 新手上路 发帖 5 积分 11 | |
|
感谢各位英雄指点,呵呵! 3楼的start曾经试过,结果弹出无数窗口,直接死机?不知为何,call也是,即使只循环2次也是,,有谁知道原因?
2楼的感觉正解,不过请教一下,为何需添加变量N,延时我理解,直接%%a,不可以么?比如我直接each %%a显示的不是从1-255,为什么要set N,还有STDOU,是什么意思,可以解释一下么,非常感谢! |
|
| 第6楼 ywjco | 发表于 2008-01-14 20:49 |
| 初级用户 发帖 17 积分 31 | |
|
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 ] |
|
| 第7楼 xhm | 发表于 2008-01-16 23:09 |
| 新手上路 发帖 2 积分 6 | |
|
学到东西了
|
|
| 第8楼 lxmxn | 发表于 2008-01-16 23:38 |
| 版主 发帖 4,938 积分 11,386 | |
|
TO ywjco: 你觉得启用变量延迟有用么?这里根本就是多余的操作。
我说把“call”改称“start”可能说简单了,但是还是用“start”的方法来就可以了。 试试这个: 另外,建议楼主不要把批处理脚本的名字写成系统已有命令的名字,比如这里的“ping.bat”就不合适,避免造成不必要的麻烦。 |
|
| 第9楼 sy790825 | 发表于 2008-01-17 13:35 |
| 新手上路 发帖 5 积分 11 | |
|
呵呵,受教了,感谢lxmxn与ywjco耐心指点!解决我想了很久的问题,thank you very mach!!!
|
|
| 第10楼 ywjco | 发表于 2008-01-17 20:22 |
| 初级用户 发帖 17 积分 31 | |
|
TO:lxmxn版主
大量使用start cmd /c这样调用子批处理会导致额外的系统开销,虽然用cmd /c参数会每次自行结束CMD窗口,但调用时系统硬盘还是狂跑一轮;相比之下,使用用“廷迟变量扩展”调用子批处理,就可以完全解决此问题。其好处是,每次均在本批处理中调用ping.bat,没有额外的CMD窗口内存开销。 若要查看这两者的差别,只要在执行这两个批处理之前,用Ctrl-Alt-Del 开启任务管理器,然后将for /L %%a in (1,1,255)中的255改为512或更大时,分别进行测试,就清楚了。 仅作学习讨论。 |
|
| 第11楼 lxmxn | 发表于 2008-01-17 22:48 |
| 版主 发帖 4,938 积分 11,386 | |
TO ywjco:目的:想写个打开254个窗口 这里我并不是讨论效率的问题,而是讨论怎么达到楼主说的这个效果。 |
|
| 第12楼 xjhdos | 发表于 2008-04-11 05:47 |
| 初级用户 发帖 24 积分 46 来自 湖北 | |
|
<font color=#FF0CF9>郁</font><font color=#FF18F3>闷</font><font color=#FF24ED>啊</font> <font color=#FF6DC9>怎</font><font color=#FF79C3>么</font><font color=#FF86BC>弄</font><font color=#FF92B6>的</font><font color=#FF9EB0>呀</font> <font color=#FFCE98>不</font><font color=#FFDB92>是</font><font color=#FFE78C>太</font><font color=#FFF386>会</font><font color=#FFFF80>呀</font>
|
|
| 第13楼 11440 | 发表于 2008-04-11 15:09 |
| 新手上路 发帖 4 积分 7 | |
|
把“call”改成“start”。
版主厉害 |
|
| 第14楼 lfopt | 发表于 2008-04-12 20:43 |
| 初级用户 发帖 34 积分 71 | |
|
用"start"NB,我喜欢
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |