批处理文件带有可变数量的命令行参数

3

我有一个批处理文件:

:LOOP
ping %1
ping %2
goto LOOP

上述文件仅适用于两个命令行参数。如何使其适用于可变数量的命令行参数。例如,如果在运行时提供了四个命令行参数,则应对所有四个服务器进行ping测试。
感谢任何帮助。
3个回答

4
你唯一的选择是使用shift来处理任意数量的参数。但是,在无限循环的第二次迭代中,这种方法不起作用。你可以通过首先将所有地址存储在数组中,然后遍历该数组来解决此问题,但有一种更简单的方法。
你可以使用%*获取单个字符串中所有参数的列表,并简单地循环遍历该字符串中的标记
@echo off
:loop
for %%x in (%*) do ping %%x
goto :loop

代码也可以在我的SVN存储库中找到。


谢谢你提供的代码,看起来非常接近我所需要的,但是你的代码似乎存在一些问题。如果我提供三个参数,它只会ping第一个和第三个IPAddress。 - user350233
@user:我这里无法复现。使用三个参数时它可以正常工作。 - Joey

0
如果只需要进行ping操作,那么只需删除外层循环并使用for语句即可。
FOR %%x IN (%*) DO ping %%x

如果您需要在外部循环中执行其他操作,只需使用外部循环和移位命令,同时检查每次迭代是否存在空参数即可。
@ECHO OFF
:loop_start
IF .%1==. GOTO end
ping %1
SHIFT
GOTO :loop_start
:end

这里是运行后面解决方案的示例,虽然两者的输出相同。请注意,我关闭了回显并添加了一个“-n 1”参数以使ping的示例输出变短。
C:\apps\Prod\85000026>tmp.bat 8.8.8.8 localhost 127.0.0.

Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=21ms TTL=52

Ping statistics for 8.8.8.8:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 21ms, Maximum = 21ms, Average = 21ms

Pinging MFGTESTFNTLSYS2 [::1] with 32 bytes of data:
Reply from ::1: time<1ms

Ping statistics for ::1:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

Pinging 127.0.0.1 with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Ping statistics for 127.0.0.1:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

0

编辑:在 Johannes 的评论后,我添加了一些行来使我的原始解决方案像原始脚本一样工作:

这个循环遍历所有参数一次:

:loop 
if %1x==x goto :EOF
ping %1
shift
goto :LOOP

这个循环无限地执行:

:loop2
call :loop %*
goto :loop2

:loop 
if %1x==x goto :EOF
ping %1
shift
goto :LOOP

这不会做同样的事情。它只会循环一次每个参数,然后调用没有参数的 ping - Joey
不,它会带参数调用 ping(我测试过了),但你是对的,它与原始脚本不同,因为它在一个周期后停止。请参见我的上面的编辑。 - Doc Brown
抱歉如果我表达不清楚;我尝试编辑但已经太晚了:我的意思是它在第一次迭代中可以正常工作,但之后就不再有用了,因为所有参数都已经被shift掉了。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接