8 Stimmen

Wie man ein DOS-Befehl in MATLAB ausführt und die Kontrolle sofort an MATLAB zurückgibt (ohne ein DOS-Fenster zu öffnen)

Ich möchte eine Batch-Datei in DOS von MATLAB ausführen und die Kontrolle sofort an MATLAB zurückgeben lassen. Allerdings möchte ich das ohne Öffnen eines DOS-Fensters machen (oder zumindest das DOS-Fenster am Ende verschwinden lassen).

Wenn ich meinen Befehl so formatiere...

s = dos('batchfilename.bat');

dann führt MATLAB die Batch-Datei aus, ohne ein DOS-Fenster zu öffnen, aber der MATLAB-Code muss auf die Rückkehr warten.

Wenn ich meinen Befehl so formatiere...

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

Die Kontrolle wird sofort an MATLAB zurückgegeben, aber es zeigt auch das DOS-Fenster an, was ich nicht möchte. (Es ist auch schwierig zu erkennen, wann die Batch-Datei "fertig" ist, wenn man es auf diese Weise macht)

Jede Hilfe wäre willkommen.

8voto

Andrew Janke Punkte 23072

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.

3voto

Ben Voigt Punkte 268424

Versuchen Sie, das mit dem Windows-Befehlsinterpreter gebündelte start -Cmdlet zu verwenden.

Sie können wahrscheinlich einfach system('start /MIN batchfilename.bat'); tun.

Fügen Sie am Ende der Batchdatei einen exit -Befehl hinzu, um sicherzustellen, dass Sie nicht mit einem (minimierten) Befehlsfenster zurückbleiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X