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

时间:2010-07-14 20:43:20

标签: batch-file

我有以下批处理文件:

:LOOP
ping %1
ping %2
goto LOOP

上述文件仅适用于两个命令行参数。如何使用可变数量的命令行参数进行此工作。例如,如果在运行时提供了四个命令行参数,那么它应该ping所有四个服务器。

任何帮助表示赞赏

3 个答案:

答案 0 :(得分:4)

您必须处理任意数量的参数的唯一选择是使用shift。但是,这在无限循环的第二次迭代中不起作用。您可以通过首先将所有地址存储在一个数组中然后迭代所述数组来解决这个问题,但是有一个更简单的变体。

您可以使用%*获取单个字符串中所有参数的列表,只需循环遍历该字符串中的标记

@echo off
:loop
for %%x in (%*) do ping %%x
goto :loop

代码也可以在my SVN repository中找到。

答案 1 :(得分: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

答案 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