0

这里的问题的简短版本,

我从一个批处理文件运行一个可执行文件(它又运行一个模拟)。我一次最多可以运行四个。有什么方法可以检查(从批处理文件中)一次运行多少个这些可执行文件?

长版,

我有一个批处理文件,它允许我运行多个模型,但由于许可,我不能同时运行超过 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 语句的“真”条件,并且批处理等待模型运行完成,然后再继续。

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

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

4

2 回答 2

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必须处理整个任务列表。

于 2012-09-06T02:05:07.503 回答
1

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

tasklist | findstr "TUFLOW"

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

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

于 2012-09-06T01:54:13.640 回答