我有4个.cmd文件。我想同时运行2次。 说我的文件是:1.cmd,2.cmd,3.cmd,4.cmd
我想并行运行1.cmd和2.cmd。现在,当任何这些结束时,我想运行3.cmd然后4.cmd。简而言之,在任何给定时间我都希望运行2个.cmd文件。
我正在使用Start命令进行并行执行。但我是脚本新手,我对如何模仿上面提到的运行cmd文件的方式感到困惑。
任何帮助都将不胜感激。
由于 Debjani
答案 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文件。
查看以下主题以获取一些想法(可能重复?)