0

我在 MATLAB 中运行优化算法,我正在调用一个批处理文件(它调用一个 EXE 文件)来为 MATLAB 中的每次迭代执行一项任务。我希望这个 EXE 在 MATLAB 中的代码继续下一次迭代之前运行并关闭。到目前为止,我已经使用了批处理文件中的 START /WAIT 命令并且它们可以工作。这是我的例子:

@echo off
@TITLE Ostrich - Optimizaton Software Toolkit

REM Launch Ostrich,wait until it completes
START /WAIT "OSTRICH" /MIN Ostrich.exe

echo Done! > OstDone.txt

现在这是我的问题。如果 Ostrich.exe 崩溃,我会收到一个提示,要求我调试或关闭程序。这意味着当我运行这个算法时,我必须在场并观看屏幕(不方便,我在有时很慢的 EXE 上运行超过 1000 次迭代)。我必须先关闭程序,然后 MATLAB 代码才能继续。

现在,如果我摆脱 /WAIT 部分,添加一个计时器并执行以下操作:

@echo off
@TITLE Ostrich - Optimizaton Software Toolkit

REM Launch Ostrich
START "OSTRICH" /MIN Ostrich.exe

REM Wait 2 seconds
ping localhost -n 2 -w 2500 > nul

REM If it takes more than 2 seconds it has probably crashed. Exit:
if %errorlevel% neq 0 exit /b %errorlevel%

上面的代码引入了新问题。首先,我必须估计每次运行EXE所需的时间(它不是一个恒定的时间,所以我必须设置一个上限)并且错误检查行只是无法关闭EXE (可能只是关闭了不理想的批处理文件)。

在第二个代码下,如果 EXE 崩溃,则会出现提示。但是,MATLAB 循环继续,EXE 的新实例在新窗口中运行。如果我遇到足够多的崩溃,我最终会在 MATLAB 循环结束时打开几个提示。在整体算法的背景下,这没什么大不了的,但也不理想。

基本上,我想编写一些代码来关闭并重新运行 EXE 文件,如果它崩溃,或者只是关闭它(没有调试或关闭提示),同时仍然使用 /WAIT 命令,因为它允许我利用一些快速 EXE 运行(EXE 的速度取决于我可能在其输入文件中修改的许多因素)。

我是使用批处理文件的新手,任何帮助将不胜感激。

4

2 回答 2

0
@echo off
@TITLE Ostrich - Optimization Software Toolkit

for /L %%a in (1,1,1000) do (
REM Launch Ostrich
START "OSTRICH" /MIN Ostrich.exe

REM Wait 2 seconds
ping -n 2 localhost>nul

REM kill ostrich if it is running or not, and pause for 2 more seconds
taskkill /f /im "ostrich.exe" >nul 2>&1
ping -n 2 localhost>nul
)
于 2013-09-02T22:34:47.603 回答
0

你通常会SetErrorMode()在你的代码中使用,只要 Ostrich.exe 是你的。

否则,除了一般禁用错误报告外,您还可以使用WerAddExcludedApplication().

于 2013-09-02T19:28:08.683 回答