一个批处理文件 - 多个命令 - 无需等待

时间:2013-04-22 19:23:51

标签: batch-file multiple-instances

我真的看过这里的多个例子,但我不能让它工作 - 所有的例子都有一种情况,你只需要调用一个实际上已经结束的命令,我需要保持我的运行。这就是我需要做的。

要配置网络设备,我可以选择使用arp命令和ping命令,但这些命令需要在同一个命令提示符中执行,但每个设备都需要在其中自己的窗口。

我需要运行arp -s 192.168.5.5 00-CC-CC-CC-CC-CC,完成后我需要运行ping -l 408 -t 192.168.5.5。 这两个命令必须在同一个命令窗口中运行。我想打开让我们同时说出其中的30个,在该特定窗口中对同一个地址进行arp'ing和ping,但在另一个窗口中使用不同的地址(我希望这是有道理的)。

现在,我可以让它运行,但它等待第一个命令完成,然后开始第二个。我使用了START,但这也不起作用。

是的,我想我可以创建30个不同的批处理文件,但这会打败对象,因为我需要配置超过500个设备,因此创建500个批处理文件需要同样长的时间;除非批处理文件可以为我创建所有必需的批处理文件?

所以,我有一个excel电子表格,可以在批处理文件中创建我需要的所有行,我希望能够使用它:

start cmd.exe /K arp -s 192.168.5.5 00-40-8C-D4-FB-BC && ping -l 408 -t 192.168.5.5   
start cmd.exe /K arp -s 192.168.5.6 00-40-8C-D4-F9-A9 && ping -l 408 -t 192.168.5.6    
start cmd.exe /K arp -s 192.168.5.7 00-40-8C-D4-FB-F6 && ping -l 408 -t 192.168.5.7    
start cmd.exe /K arp -s 192.168.5.8 00-40-8C-D4-FC-70 && ping -l 408 -t 192.168.5.8  
start cmd.exe /K arp -s 192.168.5.9 00-40-8C-D4-FB-F4 && ping -l 408 -t 192.168.5.9
start cmd.exe /K arp -s 192.168.5.10 00-40-8C-D4-FB-F8 && ping -l 408 -t 192.168.5.10

所以使用上面的命令,只有第一个命令实际运行。如果我将它设置为ping只说300次,它会切换到下一次,但是这会打败对象,因为我需要同时做30个设备,所以等待每个设备先完成将需要永远。

也许我在这里走错了路,也许有人有更好的主意?请记住,上述每个命令都必须在自己的命令提示符窗口中运行,否则如果您尝试同时执行太多操作,则arp命令会失败。

为了清楚起见,我还需要运行arp命令,完成后再运行ping命令

4 个答案:

答案 0 :(得分:1)

你需要逃避你的&& s,并且可能只改为&:

start cmd.exe /K arp -s 192.168.5.5 00-40-8C-D4-FB-BC ^& ping -l 408 -t 192.168.5.5

但是,在cmd中转义可能会很快变得棘手。我建议您创建一个包含所需内容的DoPing.cmd:

arp -s %1 %2
ping -l 408 -t %1

从您生成的cmd中调用它:

start cmd.exe /K DoPing.cmd 192.168.5.5 00-40-8C-D4-FB-BC

当然,这意味着您需要将DoPing.cmd部署到您正在运行的任何位置。

答案 1 :(得分:1)

我们假设您的数据以这种方式存在于文本文件中:

192.168.5.5 00-40-8C-D4-FB-BC
192.168.5.6 00-40-8C-D4-F9-A9
192.168.5.7 00-40-8C-D4-FB-F6
192.168.5.8 00-40-8C-D4-FC-70
192.168.5.9 00-40-8C-D4-FB-F4
192.168.5.10 00-40-8C-D4-FB-F8

下面的批处理文件创建多个批处理文件,每个文件都包含所需的命令,然后启动它们。每个创建的批处理文件在完成业务后都会自行删除。

@echo off
for /F "tokens=1,2" %%a in (theDataFile.txt) do (
   echo @echo off > %%b.bat
   echo arp -s %%a %%b >> %%b.bat
   echo ping -l 408 -t %%a >> %%b.bat
   echo del %%b.bat ^& exit >> %%b.bat
   start %%b.bat
)

答案 2 :(得分:0)

尝试引用整个论点,也可以使用&而不是&&

例如

start cmd.exe /K "arp -s 192.168.5.5 00-40-8C-D4-FB-BC & ping -l 408 -t 192.168.5.5"

答案 3 :(得分:0)

问题是你需要引用传递给CMD的参数。你原来是:

start cmd.exe /K arp -s 192.168.5.5 00-40-8C-D4-FB-BC && ping -l 408 -t 192.168.5.5

此语法将启动CMD窗口并将ARP命令作为参数传递给该窗口,但不是&& ping部分。相反,它被视为在START之后运行的命令。

为了纠正这个问题,我们可以添加明确将arp和ping作为单个参数传递给CMD的引号。

start cmd.exe /K "arp -s 192.168.5.5 00-40-8C-D4-FB-BC && ping -l 408 -t 192.168.5.5"

此外,I see it suggested即使标题为空,也应始终为start命令提供标题。所以....

start "" cmd.exe /K "arp -s 192.168.5.5 00-40-8C-D4-FB-BC && ping -l 408 -t 192.168.5.5"

当然你还有其他选择。和&&仅当第一个命令返回成功时才运行第二个命令。所以在理论上和可用于确保第二个命令始终运行。如果arp调用失败,那么就没有理由同时ping这样&&努力......

我假设你是故意打开新的CMD窗口,这样你就可以看到结果了,但你总是可以使用/ c而不是/ k来自动关闭它们。

作为/ c的注释。你在另一个回答中提到击中控制+ c杀死所有窗口。这是正常行为,但使用/ c运行CMD应该使控件+ c仅适用于当前窗口。在另一个答案中更改以下行:

start %%b.bat

为...

start cmd /c %%b.bat

(或类似的东西)应该让你在循环产生的各个窗口中使用CTRL + C.