2010-08-25 168 views
2

我有4个.cmd文件。我想一次运行2次。 说我的文件是:1.cmd,2.cmd,3.cmd,4.cmd如何并行运行几个.cmd文件

我想并行运行1.cmd和2.cmd。现在,当这些结束时,我想运行3.cmd,然后4.cmd。总之,在任何给定的时间我想要运行2个.cmd文件。

我正在使用Start命令进行并行执行。但我对脚本不熟悉,对于如何修改上述运行cmd文件的方式感到困惑。

任何帮助,将不胜感激。

感谢 Debjani

回答

1

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

听起来更像是要使用 Powershell 2.但是,您可以使用start产生 新窗口(或其他进程) ,另请参阅此 回答。尽管您可能需要使用其他一些工具和小小的 来创建类似于“进程池”的 (一次只能运行最多 的实例)。 您可以通过使用 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> rem跳回去看看我们是否可以产生一个新的流程现在 转到循环 转到:EOF

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

运行实例 后来的数量。 FOR/F “有usebackq” %%吨(tasklist /fo csv /fi "imagename eq wait.exe"^|wc -l)不要设置 INSTANCES = %%吨 转到:EOF

它产生一个最大的是并行执行和 最小化四个新 过程。等待时间需要调整为 ,具体取决于每个过程如何执行以及运行多长时间 。您可能还需要 调整进程名称,其中 任务列表正在查找,如果您正在执行 其他操作。

尽管如此,没有办法正确计数 批处理产生的 进程。一种方法是 在 开始时的分批(%RANDOM%)创建一个随机数,并创建一个 帮助一批,做加工 (或派生的处理程序),但 可以设置其窗口标题为 参数:

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

这将是一个简单的批处理,设置 其标题于第一参数和 然后运行与 第三作为参数的第二参数。然后您可以通过 标题(tasklist /fi "windowtitle eq ...")指定的窗口 进程在任务列表中筛选 标题(tasklist /fi "windowtitle eq ...")。这应该相当可靠地工作,并防止太多错误 积极。搜索cmd.exe 如果仍有 某些实例正在运行,那么这将是一个糟糕的主意,因为这会限制 您的工作进程池。

您可以使用%NUMBER_OF_PROCESSORS% 创建多个实例产生的合理默认值。

你也可以很容易地适应这种使用 psexec产卵的过程 远程(但不会是非常可行的 因为你必须在另一台机器上拥有管理权限的 以及 在提供密码批量)。 但是,您必须使用进程名称 进行过滤。