首页 文章

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

提问于
浏览
0

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

要配置网络设备,我可以选择使用 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

    你需要逃避你的&& 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

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

    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
    )
    
  • 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"
    
  • 1

    问题是你需要引用传递给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即使 Headers 为空,也应始终为start命令提供 Headers . 所以....

    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.

相关问题