|
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
状态 离线
|
|
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
状态 离线
|
|
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:
这里我并不是讨论效率的问题,而是讨论怎么达到楼主说的这个效果。
|
|
2008-1-17 22:48 |
|
|
xjhdos
初级用户
积分 46
发帖 24
注册 2008-4-10 来自 湖北
状态 离线
|
『第
12 楼』:
<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>
|
|
2008-4-11 05:47 |
|
|
11440
新手上路
积分 7
发帖 4
注册 2007-9-22
状态 离线
|
『第
13 楼』:
把“call”改成“start”。
版主厉害
|
|
2008-4-11 15:09 |
|
|
lfopt
初级用户
积分 71
发帖 34
注册 2008-3-12
状态 离线
|
|
2008-4-12 20:43 |
|