2013-09-02 1 views
0

Я запускаю алгоритм оптимизации в MATLAB, и я вызываю пакетный файл (который вызывает файл EXE) для выполнения задачи для каждой итерации в MATLAB. Я хочу, чтобы этот EXE запускался и закрывался до того, как код в MATLAB продолжит следующую итерацию. До сих пор я использовал команды START/WAIT в пакетном файле, и они работают. Вот мой пример:Как избежать запроса при сбое EXE

@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, я получаю приглашение с просьбой отлаживать или закрывать программу. Это означает, что я должен присутствовать и смотреть экран, когда я запускаю этот алгоритм (не удобно, я использую более 1000 итераций на иногда медленном EXE). Мне нужно закрыть программу до того, как код 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 зависит от многих факторов, которые я могу использовать во входных файлах).

Я новичок в использовании пакетных файлов, и любая помощь будет высоко оценена.

ответ

0

В вашем коде, как правило, используется SetErrorMode(), при условии, что Ostrich.exe за вами.

В противном случае, кроме отключения сообщений об ошибках в общем случае, вы можете отключить отчет об ошибках для каждого приложения, используя WerAddExcludedApplication().

+0

Ostrich.exe не является моим, и я не очень хорошо знаком с C++. Я попытался пройти Центр действий и отключить отчет об ошибках для Ostrich.exe, и я все еще получил приглашение, когда он разбился. Есть ли способ обнаружить сбой из пакетного файла и закрыть его и снова запустить его снова? – ymzkala

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 
) 
+0

Спасибо, что избавляется от лишних экземпляров EXE, которые разбились и не будут закрыты, но он не подавляет подсказки об ошибках, поэтому я все равно получаю несколько ошибок в конце. Также FYI, мой цикл for находится в MATLAB, и целью командного файла является просто запустить один раз. Думаю, это лучшее, что я могу сделать. Есть ли способ сделать это при использовании команды/WAIT в START (как при проверке ошибок, тогда используйте taskkill без таймера)? – ymzkala

+0

Я не знаю Матлаба. Возможно, было бы полезно включить его в качестве тега. – foxidrive