这里的问题的简短版本,
我从批处理文件中运行一个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时间,因为批处理正在等待第四次迭代完成。或者更糟糕的是,第四次迭代在其他三次迭代之前完成,并最终尝试运行四个以上的模型,导致许可弹出,需要用户解雇。
我一定会错过任何建议或其他解决方案吗?
答案 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。