Externe Anwendung: Konsolenfenster + Beenden

higginz

Grünschnabel
Hallo,

ich starte aus meinem Java-Programm eine (*.EXE)-Konsolen-Anwendung mit dem Processbuilder. Dabei übergebe ich auch Parameter. Das funktioniert alles super. Einziges Problem: Es öffnet sich keine Konsole für die Anwendung, sie läuft im Hintergrund. Ich möchte aber möglichst die Konsolen-Ausgaben sehen.

Aufruf:
String[] command = new String[3];
command[0] = "C:\\blabla.exe";
command[1] = "-param1";
command[2] = "value1";
ProcessBuilder pb = new ProcessBuilder();
pb.command(command);
Process proc = pb.start();

Wenn ich die Anwendung nicht direkt, sondern über "cmd start" starte, öffnet sich die gewünschte Konsole, aber ich kann die Anwendung nicht mehr über proc.destroy() beenden. Ich vermute, dass da in der Variable proc nicht meine Anwendung, sondern "cmd" steht.

Die eigene Anwendung muss ich aber - selbst wenn ich sie ausserhalb von Java starte - mit "Strg+C" beenden, da sie sich nicht von alleine beenden lässt.

Hat jemand einen Tipp, was ich da machen kann?


Gruß
Martin
 
Wenn ich dich richtig verstanden hab dann könnte das hier eine Lösung für sich sein.
Bei dem Beispiel wird alles was auf der Konole steht in der Netbeans/ Eclipse oder was auch immer Konsole ausgegeben.

Code:
import java.io.*;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws IOException {
        ExecDir();
    }

    public static void ExecDir() throws IOException {
        ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "dir");
        builder.directory(new File("c:/"));
        Process p = builder.start();

        Scanner s = new Scanner(p.getInputStream()).useDelimiter("\\Z");
        System.out.println(s.next());
    }
}

Das kannst du dann ja nach belieben in eine Datei schreiben oder in einem Fenster ausgeben oder wie auch immer.

Hab das Beispiel übrigens aus dem Buch Java ist eine Insel!

MfG
 
Hallo thealflex,

danke für die schnelle Antwort.

Ich weiß schon, wie man die Ausgabe umleiten kann, aber ich möchte ja den mit

Code:
String[] command = new String[6];
command[0] = "cmd";
command[1] = "/c";
command[2] = "start";
command[3] = "C:\\blabla.exe";
command[4] = "-param1";
command[5] = "value1";
ProcessBuilder pb = new ProcessBuilder();
pb.command(command);
proc = pb.start();

erstellten Prozess beenden. Also genauer gesagt will ich "blabla.exe" mittels proc.destroy() beenden. Aber proc zeigt auf "cmd" und nicht auf "blabla.exe".

Ich hoffe, es ist verständlich, was ich möchte. ;)
 
hi,

solltest vieleicht das cmd weg lassen!? und nur start blbla.exe aufrufen....

hmf
 
Zuletzt bearbeitet von einem Moderator:
Hallo _jsd_,

sorry, ich verstehe deinen Tipp nicht.

Meinst du, ich sollte dem ProcessBuilder ein Startverzeichnis (hier: "c:\\") mitgeben und dann als Anwendung nur noch "blabla.exe" übergeben? Dann bekomme ich eine IOException mit der Meldung: "CreateProcess error=2, Das System kann die angegebene Datei nicht finden."

Wenn ich die EXE mit dem gesamten Pfad ausführe und kein Verzeichnis setze, läuft zwar die Anwendung wie geschmiert, aber ich sehe keine Ausgabe. Vielleicht sollte ich hier einen weiteren Prozess "cmd" starten und dem den InputStream von "blabla.exe" übergeben?

Was meinst du mit "ohne verzeichniswechsel"? Mache ich den denn überhaupt?

Nur mit "start" und ohne "cmd" gehts auch nicht, da ja "start" ein Konsolenbefehl ist, den er sonst garnicht kennt.
 
Immer wenn ich versuche "start" ohne vorher "cmd" aufzurufen, krieg ich den Fehler, dass er die Datei (start) nicht finden kann. Die gibts ja auch nicht in meinem Verzeichnis. Wie gesagt, ist ja auch ein Konsolenbefehl.

Die Ausgabe mittels dem Code von thealflex funktioniert zwar, aber sie bleibt irgendwo hängen, genauso wie mein Java-Programm.
 
Zurück