我有以下批处理文件:
:LOOP
ping %1
ping %2
goto LOOP
上述文件仅适用于两个命令行参数。如何使用可变数量的命令行参数进行此工作。例如,如果在运行时提供了四个命令行参数,那么它应该ping所有四个服务器。
任何帮助表示赞赏
答案 0 :(得分:4)
您必须处理任意数量的参数的唯一选择是使用shift
。但是,这在无限循环的第二次迭代中不起作用。您可以通过首先将所有地址存储在一个数组中然后迭代所述数组来解决这个问题,但是有一个更简单的变体。
您可以使用%*
获取单个字符串中所有参数的列表,只需循环遍历该字符串中的标记:
@echo off
:loop
for %%x in (%*) do ping %%x
goto :loop
代码也可以在my SVN repository中找到。
答案 1 :(得分:0)
这会遍历所有参数:
: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
答案 2 :(得分:0)
如果仅需要执行ping操作,则只需除去外部循环并使用for语句即可。
FOR %%x IN (%*) DO ping %%x
如果您需要在该外部循环中执行其他操作,则只需在检查每次迭代中是否有空参数时使用外部循环和shift命令即可。
@ECHO OFF
:loop_start
IF .%1==. GOTO end
ping %1
SHIFT
GOTO :loop_start
:end
这里是运行后一种解决方案的示例,尽管两者的输出相同。注意,我确实关闭了echo并在ping上添加了“ -n 1”参数,以使示例输出简短。
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