Get-Command-Prompt-Ausgabe zu einem String In Java
Ich brauche eine java-Methode, das Lesen wird die Eingabeaufforderung die Ausgabe und speichern in einen String Einlesen in Java.
Dies ist, was ich bisher aber nicht richtig funktioniert.
public void testGetOutput() {
System.out.println("\n\n****This is the testGetOutput Method!****");
String s = null;
String query = "dir " + this.desktop;
try {
Runtime runtime = Runtime.getRuntime();
InputStream input = runtime.exec("cmd /c " + query).getInputStream();
BufferedInputStream buffer = new BufferedInputStream(input);
BufferedReader commandResult = new BufferedReader(new InputStreamReader(buffer));
String line = "";
try {
while ((line = commandResult.readLine()) != null) {
s += line + "\n";
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}//end testGetOutput()
Ich denke, das problem ist, wenn ich versuche, ändern Sie die Abfrage so ein Befehl der ausgeführt wird HandBrakeCLI.exe. Ein Blick auf mein system, wenn das Programm ausgeführt wird (aber das scheint angehalten zu haben), es zeigt mir, dass HandBrakeCLI.exe ausgeführt wird, unter einem cmd-Fenster, die unter meiner IDE. All das macht Sinn, aber das HandBrakeCLI.exe nicht verlassen, so dass ich vermute, dass ist der Grund, warum ich nicht Lesen können, den Ausgang als Eingang zu meinem Programm.
So, nach diesem hintergrund. Meine große Frage ist: Wie bekomme ich HandBrakeCLI.exe zu schließen, nachdem es fertig mit meiner Abfrage, so kann ich Holen Sie sich Ihre Ausgabe?
Nur für die extra-info, der einzige Unterschied zwischen der oben beschriebenen Methode und der scan-DVD-Methode habe ich für HandBrakeCLI ist die Abfrage-variable unterschiedlich ist. Wie in diesem Beispiel:
String query = "C:\Users\Kent\Desktop\HBCLI\HandBrakeCLI -t --scan -i "C:\Users\Kent\Desktop\General Conference DVDs\Sources\174th October 2004\DVD 1"; //this is actually a variable in the DVD object, but here's an example'
Oh, und übrigens, wenn ich die Abfrage ausführen in einer regular-Eingabeaufforderung, es tut genau das, was ich will, geben mir die Ausgabe, die ich dringend wünschen!
Hier ist das ursprüngliche problem (ich bin mir nicht sicher, wie Sie Sie, um Sie erneut eine Frage):
Ich habe schon überall gesucht und kann es nicht herausfinden. Ich bin mir nicht sicher, was ich gefunden habe ist auch relevant, was ich tun möchte. Ich habe nicht eine ganze Menge code für Sie noch nicht, er wird also nicht viel tun, um code hier und ich denke, das sollte sehr einfach sein, so werde ich Ihnen einige screenshots hier. So, hier ist meine Aufgabe:
-
Scan-Ordner, die voll ist von gerippten DVD-Ordner (Video_TS Ordner mit VOB-Dateien etc.) und speichern Sie diese Ordner-Namen als Titel der DVD.
-
Durchsuchen den Ordner mit der HandBrakeCLI und speichern Sie die Ausgabe in einen string.
-
Regex den string zur Identifizierung der einzelnen Titel, Kapitel und Sprache.
-
Generieren von Abfragen, um zurück zu geben, HandBrakeCLI bulk-encode jede Sprache in jedem Kapitel, in jedem Titel der einzelnen DVD (Sie können sehen, warum ich will, dies zu automatisieren!)
-
Speichern Sie diese Abfragen in eine *.bat-Datei
Nur ein Teil der ich nicht sicher bin, ist Schritt 2! Ich tun kann, alles andere ziemlich leicht. Ich habe viel gelesen über OutputStreams, aber ich kann einfach nicht scheinen, um zu verstehen, wie es funktioniert. Ich muss nur die Ausgabe auf einen string, ich kann regex, um die Sachen, die ich brauche. Hier sind die screenshots von dem, was ich brauche input und das, was ich brauche, um Streifen aus der Ausgabe:
Eingang zu HandBrakeCLI:
Ausgabe zu Scannen:
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst müssen Sie eine nicht-blockierende Art und Weise zu Lesen
Standard.out
undStandard.err
Dann müssen Sie zu binden, diese Klasse in den jeweiligen
InputStream
undOutputStream
Objekte.Das ist so ziemlich der Kessel-Platte, die ich verwenden, wenn ich brauche, um
Runtime.exec()
alles in Java.Eine erweiterte Möglichkeit wäre die Verwendung
FutureTask
undCallable
oder zumindestRunnable
anstatt direkt AusweitungThread
was nicht der best practice.HINWEIS:
Den
@Nonnull
Anmerkungen sind in der JSR305 Bibliothek. Wenn Sie mit Maven, und Maven sind Sie nicht, fügen Sie einfach diese Abhängigkeit zu Ihrerpom.xml
.Dieser voll Java-Programm Beispiel wird der Befehl " dir " (directory-listing) auf den Befehl Linie und zieht das Ergebnis in eine Zeichenkette um und gibt diese auf der Konsole.
Unter Windows ist dies das Ergebnis bekomme ich
Vorausgesetzt, Sie verwenden
Runtime.exec()
starten Sie Ihren externen Prozess, so dass Sie eineProcess
Objekt gibt es drei relevante Methoden für das Objekt:getOutputStream()
,getInputStream()
, undgetErrorStream()
.Ich denke, es ist einfach zu verwirrt über diese -- Sie sind wohl denken, dass Sie möchten, um zu sehen, den Prozess-output, also ein "output stream" ist, was Sie wollen. Aber die Sache, die Sie sich merken müssen ist, dass die Benennung dieser Objekte aus dem Java-code der Perspektive -- ein Ausgabestrom ist für Java zu schreiben, Ausgang, während ein InputStream ist für Java zu Lesen, die Eingabe aus. Der Ausgang des externen Prozesses aus Java-Sicht, input.
So verwenden Sie
getInputStream()
- und rufen entsprechende Methoden auf dieInputStream
zurückgegeben, indem Sie es zum Lesen der Ausgabe. Sie können auch verwenden möchtengetErrorStream()
um sicherzustellen, dass Sie nicht etwas fehlt, denn es ist geschrieben, um standard-Fehler.exec()
erwartet eine tatsächliche ausführbare -- eine batch-Datei ist kein ausführbares Programm, es ist eine Reihe von Befehl, der ausgeführt werden von der Windows-shell. Siehe stackoverflow.com/questions/615948/....start
in das " external command, was ich gar nicht denken, nichts, wenn ich verwies Sie auf die andere Antwort. Das öffnet ein separates Kommando-Fenster, wo die Ausgabe des Befehls geschrieben werden-also, es geht nicht um die standard-Ausgabe der aktuellen cmd-Prozess. Versuchen Siestart
von der Kommandozeile, z.B.cmd /c path-to-batch-file.bat
.while ((line = commandResult.readLine()) != null) {...}
Es gut laufen (ein bisschen) für ein paar Iterationen (genug, um alle drucken die Befehle in den *.bat-Datei), dann wird es zu stoppen (auch wenn das Debuggen, und Sie werden nicht werfen Fehler, es will einfach nicht bewegen) und NetBeans sagt mir, es ist immer noch laufen. Nicht sicher, was das problem ist.