Как выполнить команду dos из MATLAB и немедленно вернуть управление в MATLAB (без вызова окна dos) - PullRequest
8 голосов
/ 19 января 2012

Я хочу выполнить командный файл в DOS из MATLAB и немедленно вернуть управление в MATLAB.Тем не менее, я хочу сделать это, не открывая окно дос (или, по крайней мере, заставить окно дос исчезнуть в конце).

Если я отформатирую свою команду следующим образом ...

s = dos('batchfilename.bat');

затем MATLAB запускает пакетный файл, не открывая окно dos, но код MATLAB должен ждать возврата.

Если я отформатирую свою команду следующим образом ...

s = dos('batchfilename.bat &');

Управление немедленно возвращается в MATLAB, но оно также отображает окно DOS, которое мне не нужно.(Также сложно определить, когда пакетный файл «готов», когда вы делаете это таким образом)

Буду признателен за любую помощь.

Ответы [ 2 ]

7 голосов
/ 19 января 2012

Используйте поддержку внешних интерфейсов Matlab для получения доступа к функциям управления процессами языка более низкого уровня.

.NET версия

Используйте класс .NET System.Diagnostics.Process. Это позволит вам запустить процесс асинхронно, проверить, когда он завершился, и собрать код выхода. И вы можете при желании скрыть его окно или оставить его видимым для отладки.

Вы можете вызывать .NET классы напрямую из M-кода.

function launch_a_bat_file()
%//LAUNCH_A_BAT_FYLE Run a bat file with asynchronous process control

batFile = 'c:\temp\example.bat';
startInfo = System.Diagnostics.ProcessStartInfo('cmd.exe', sprintf('/c "%s"', batFile));
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;  %// if you want it invisible
proc = System.Diagnostics.Process.Start(startInfo);
if isempty(proc)
    error('Failed to launch process');
end
while true
    if proc.HasExited
        fprintf('\nProcess exited with status %d\n', proc.ExitCode);
        break
    end
    fprintf('.');
    pause(.1);
end

Java-версия

. Для версии .NET требуется Matlab, достаточно новый для поддержки .NET. Вот Java-версия для старых Matlabs, как, например, OP. Должно также работать в системах, отличных от Windows, с небольшими изменениями.

function launch_a_bat_file_with_java
%LAUNCH_A_BAT_FILE_WITH_JAVA  Java-based version for old Matlab versions

batFile = 'c:\temp\example.bat';
cmd = sprintf('cmd.exe /c "%s"', batFile);
runtime = java.lang.Runtime.getRuntime();
proc = runtime.exec(cmd);

while true
    try
        exitCode = proc.exitValue();
        fprintf('\nProcess exited with status %d\n', exitCode);
        break;
    catch
        err = lasterror(); % old syntax for compatibility
        if strfind(err.message, 'process has not exited')
            fprintf('.');
            pause(.1);
        else
            rethrow(err);
        end
    end
end

Возможно, вам придется поиграться с вводом / выводом в версии Java, чтобы избежать зависания запущенного процесса; demarcmj отмечает, что вам нужно прочитать и очистить поток ввода процесса для stdout, чтобы избежать его заполнения.

3 голосов
/ 19 января 2012

Попробуйте использовать командлет start, прилагаемый к интерпретатору команд Windows.

Возможно, вы можете просто system('start /MIN batchfilename.bat');

Поместить команду exit в конец пакетного файла.чтобы убедиться, что у вас нет (свернутой) командной строки.

...