使用批处理文件返回正在运行的可执行文件的数量?

时间:2012-09-06 01:15:01

标签: batch-file

这里的问题的简短版本,

我从批处理文件中运行一个exceutable(进而运行一个模拟)。我可以同时运行其中的四个。是否有任何方法可以检查(从批处理文件中)一次运行多少个可执行文件?

长版,

我有一个批处理文件,它允许我运行多个模型,但是要求许可我不能同时运行4个以上的模型。然而,我可以将它们排队等待运行,但是我正在努力编写批处理文件,以确保始终有四个模型在运行。我的最大努力(从搜索互联网拼凑而成)在下面

            FOR %%a in (%A%) do (
                FOR %%b in (%B%) DO (
                    FOR %%c in (%C%) DO (
                         FOR %%d in (%D%) DO (
                            SET /A COUNT+=1
                            SET /A Result =!COUNT!%%4
                            :: set Result to the remainder of the Count divided by 4
                            if !Result! == 0 (
                                start "TUFLOW" /wait C:\Tuflow\TuflowExe\Build_2011_09_AF_64\TUFLOW_iSP_w64.exe -e1 %%a -s1 %%b -s2 %%c -s3 %%d C:\Tuflow\Model\Ohoka\runs\OH.tcf
                            ) else (
                                start "TUFLOW" C:\Tuflow\TuflowExe\Build_2011_09_AF_64\TUFLOW_iSP_w64.exe -e1 %%a -s1 %%b -s2 %%c -s3 %%d C:\Tuflow\Model\Ohoka\runs\OH.tcf
                            )
                         )
                    )
                )
            )

其中A,B,C和D是包含传递给可执行文件的变量组合的数组。然后我有一个记录迭代的计数,在每第四次迭代时触发if语句的“True”条件,批处理等到模型运行完成后再继续。

这没关系,但我的其他三个模型可能会提前完成,从而释放未使用的宝贵cpu时间,因为批处理正在等待第四次迭代完成。或者更糟糕的是,第四次迭代在其他三次迭代之前完成,并最终尝试运行四个以上的模型,导致许可弹出,需要用户解雇。

我一定会错过任何建议或其他解决方案吗?

2 个答案:

答案 0 :(得分:2)

使用tasklist.exe

计算正在运行的程序数量相对容易
for /f "skip=3" %%x in ('tasklist /FI "IMAGENAME eq TUFLOW_iSP_w64.exe"') do set /a count=count+1
echo TUFLOW_iSP_w64.exe is running %count% times.

请记住每次运行时清除count或将其设置为0

或者,更慢:

for /f %%x in ('tasklist ^| find /c "TUFLOW_iSP_w64.exe"') set count=%%x
Echo TUFLOW_iSP_w64.exe is running %count% times.

上述代码较慢,因为find必须处理整个任务列表。

答案 1 :(得分:1)

我会尝试每隔几秒运行一次的轮询循环,调用

tasklist | findstr "TUFLOW"

获取输出中的行数,如果数字小于4,则开始新的运行。

编写复杂的批处理文件似乎没有任何问题,所以我不会在这里尝试编码。计算命令输出的行可以在FOR /F中完成。轮询延迟将采用sleep实施。如果您有例如安装了Cygwin,你已经拥有了这个。大多数Windows版本都有一个未记录的命令timeout NumberOfSeconds,我从中了解到in this article