如何并行运行几个.cmd文件

时间:2010-08-25 06:50:03

标签: cmd parallel-processing

我有4个.cmd文件。我想同时运行2次。 说我的文件是:1.cmd,2.cmd,3.cmd,4.cmd

我想并行运行1.cmd和2.cmd。现在,当任何这些结束时,我想运行3.cmd然后4.cmd。简而言之,在任何给定时间我都希望运行2个.cmd文件。

我正在使用Start命令进行并行执行。但我是脚本新手,我对如何模仿上面提到的运行cmd文件的方式感到困惑。

任何帮助都将不胜感激。

由于 Debjani

2 个答案:

答案 0 :(得分:1)

我在“Parallel execution of shell processes”给出了一次答案,引用了这里:

  

听起来更像是你想要使用的   Powershell 2.但是,你可以产卵   新的cmd窗口(或其他进程)   使用start,另见   回答。虽然你可能不得不这样做   使用一些其他工具和一点点   诡计创造类似的东西   “进程池”(只有一个最大值   一次运行的 n 个实例)   你可以通过使用来实现后者   tasklist /im并计算多少   已存在(for循环或wc,   如果适用),只需等待(ping -n 2 ::1 >nul 2>&1)并再次重新检查是否可以产生新的   过程

     

我拼凑了一点测试   批量:

@echo off
for /l %%i in (1,1,20) do call :loop %%i
goto :eof

:loop
call :checkinstances
if %INSTANCES% LSS 5 (
    rem just a dummy program that waits instead of doing useful stuff
    rem but suffices for now
    echo Starting processing instance for %1
    start /min wait.exe 5 sec
    goto :eof
)
rem wait a second, can be adjusted with -w (-n 2 because the first ping
     

立即返回;       rem否则只使用一个未使用的地址和-n 1)       echo等待实例关闭...       ping -n 2 :: 1> nul 2>& 1       rem跳回来看看我们现在是否可以生成一个新进程       转到循环       转到:eof

:checkinstances
rem this could probably be done better. But INSTANCES should contain
     

正在运行的实例数   然后。       for / f“usebackq”%% t in(tasklist /fo csv /fi "imagename eq wait.exe"^|wc -l)设置   INSTANCES = %%吨       转到:eof

     

它最多会产生四个新的   并行执行的进程   最小化。等待时间需要   可能调整,取决于如何   每个过程都做了多少,多长时间   在跑。你可能也需要   调整进程名称   任务列表正在考虑你是否正在做   别的什么。

     

没有办法正确计算   由此产生的进程   但批量。一种方法是   在开头创建一个随机数   批处理(%RANDOM%)并创建一个   执行处理的辅助批处理   (或产生处理程序)但是   可以将其窗口标题设置为a   参数:

@echo off
title %1
"%2" "%3"
     

这将是一个简单的批次设置   它的第一个参数的标题和   然后运行第二个参数   第三个是争论。那你可以   通过仅选择过滤任务列表   具有指定窗口的进程   标题(tasklist /fi "windowtitle eq ...")。这应该公平   可靠并防止过多的错误   阳性。正在搜索cmd.exe   如果你还有,那将是一个坏主意   一些实例正在运行,因为这限制了   你的工人流程池。

     

您可以使用%NUMBER_OF_PROCESSORS%   如何创造合理的默认   产卵的很多例子。

     

您也可以轻松调整使用   psexec生成进程   远程(但不太可行   因为你必须拥有管理员权限   在另一台机器上以及   在批处理中提供密码)。   您必须使用进程名称   然而,过滤然后。

答案 1 :(得分:0)

我没试过这个,但我假设你可以用PowerShell做到这一点。使用这种结构:

http://www.dougfinke.com/blog/index.php/2008/01/30/run-your-powershell-loops-in-parallel/

在此示例中,您应该能够执行cmd / bat文件。

查看以下主题以获取一些想法(可能重复?)

Parallel execution of shell processes