2017-11-02 2 views
1

Ich habe Probleme beim Schreiben an eine Eingabeaufforderung, die ich über ProcessBuilder öffnen kann.Schreiben in den Eingangsstrom des geöffneten Terminals

Ich habe folgendes:

public class Terminal { 

    public static void main(String[] args) { 

     List<String> launch = new ArrayList<String>(); 
     launch.add("cmd"); 
     launch.add("/c"); 
     launch.add("start"); 
     launch.add("cmd.exe"); 
     launch.add("/k"); 

     try { 
      ProcessBuilder builder = new ProcessBuilder(launch); 
      Process process = builder.start(); 
      OutputStream stdin = process.getOutputStream(); 
      InputStream stdout = process.getInputStream(); 

      BufferedReader r = new BufferedReader(new InputStreamReader(stdout)); 
      BufferedWriter w = new BufferedWriter(new OutputStreamWriter(stdin)); 

      w.write("dir"); 
      w.flush(); 
      w.close(); 

     } 
     catch (IOException io) { 
      io.printStackTrace(); 
     } 

    } 
} 

Und das öffnet erfolgreich eine neue Windows-Eingabeaufforderung. Aber es schreibt nie dir dazu. Die Eingabeaufforderung wird nur geöffnet und zeigt nur das Verzeichnis an, aus dem java Terminal ausgegeben wurde.

Wie kann ich aktiv in ein über einen Prozess geöffnetes Terminal schreiben?

Edit: Wenn ich die Befehlsfolge Liste "cmd.exe /k start dir" dann die neu gelaicht Eingabeaufforderung geben Sie den Befehl „dir“ ist in der Tat ändern und es in dem neuen Terminal angezeigt werden soll. Ich kann nicht scheinen, die korrekte Weise zu finden, auf den Strom zuzugreifen, um neue Befehle zu ihm zu schreiben.

public class Terminal { 

    public static void main(String[] args) { 

     List<String> launch = new ArrayList<String>(); 
     launch.add("cmd"); 
     launch.add("/k"); 
     launch.add("start"); 
     launch.add("dir"); 

     try { 
      Process p = new ProcessBuilder(launch).start(); 
     } 
     catch (IOException io) { 
      io.printStackTrace(); 
     } 

    } 
} 

Antwort

2

Lässt einen Blick auf, was cmd /c start cmd /k tut:

  • cmd /c startet eine Eingabeaufforderung, führt die folgenden Befehle ein, dann beendet.
  • start startet einen neuen Prozess mit den gegebenen Befehle
  • cmd /k einen Befehl erwartet (die Sie bieten nicht), führt sie, dann bleibt offen

So: Sie starten zwei Instanzen von cmd. Die zweite Instanz wird unter Verwendung von start gestartet, wodurch ein neuer Prozess ausgelöst wird. Sie erwarten, dass "dir" im zweiten Prozess angezeigt wird, während es in den ersten geschrieben wird. Leider endet die erste sofort nach dem Aufruf start seit Sie es mit /c gestartet haben.

Versuchen Sie, /c zu /k zu ändern, dann sollte die "dir" im ersten Fenster angezeigt werden.

+0

Also Gesamtbefehl '" cmd/k Start cmd/k "'? – datta

+0

@datta warum nicht nur '' cmd''? Das startet eine Eingabeaufforderung. – f1sh

+0

Wenn der einzige Befehl 'cmd' ist, wird kein anderes Terminal geöffnet. Wenn ich zu "cmd/k start" umschalte, wird es geöffnet, aber "dir" wird nicht ausgeführt. Wenn ich zu "start cmd/k" wechsle, sagt es "start" nicht. Letzteres funktioniert, wenn Sie es direkt in einer geöffneten Eingabeaufforderung ausführen. Ich führe bereits 'java Terminal' von einer Eingabeaufforderung aus; Ich brauche es, um eine weitere Eingabeaufforderung zum Lesen/Schreiben zu öffnen. – datta

Verwandte Themen