Verwenden Sie die Unterstützung von Matlab's External Interfaces, um Zugriff auf die Prozesssteuerungsmerkmale einer Programmiersprache auf niedrigerer Ebene zu erhalten.
.NET Version
Verwenden Sie die .NET System.Diagnostics.Process-Klasse. Damit können Sie einen Prozess asynchron ausführen, überprüfen, wann er beendet ist, und den Exit-Code abrufen. Und Sie können optional sein Fenster ausblenden oder sichtbar lassen zum Debuggen.
Sie können .NET-Klassen direkt aus M-Code aufrufen.
function launch_a_bat_file()
%//LAUNCH_A_BAT_FYLE Führen Sie eine Batch-Datei mit asynchroner Prozesssteuerung aus
batFile = 'c:\temp\example.bat';
startInfo = System.Diagnostics.ProcessStartInfo('cmd.exe', sprintf('/c "%s"', batFile));
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; %// wenn Sie es unsichtbar möchten
proc = System.Diagnostics.Process.Start(startInfo);
if isempty(proc)
error('Fehler beim Starten des Prozesses');
end
while true
if proc.HasExited
fprintf('\nProzess beendet mit Status %d\n', proc.ExitCode);
break
end
fprintf('.');
pause(.1);
end
Java-Version
Die .NET-Version erfordert ein neueres Matlab mit .NET-Unterstützung. Hier ist eine Java-basierte Version für ältere Matlabs, wie es sich bei OP herausstellt, zu haben. Sollte auch auf Nicht-Windows-Systemen mit einigen Modifikationen funktionieren.
function launch_a_bat_file_with_java
%LAUNCH_A_BAT_FILE_WITH_JAVA Java-basierte Version für alte Matlab-Versionen
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('\nProzess beendet mit Status %d\n', exitCode);
break;
catch
err = lasterror(); % alte Syntax für Kompatibilität
if strfind(err.message, 'Prozess wurde nicht beendet')
fprintf('.');
pause(.1);
else
rethrow(err);
end
end
end
Sie müssen möglicherweise mit der Ein- und Ausgabe im Java-Teil herumspielen, um zu vermeiden, dass der gestartete Prozess hängt; demarcmj weist darauf hin, dass Sie den Eingabestrom des Prozesses lesen und leeren müssen, um zu verhindern, dass er sich füllt.