Übergabe eines Befehls an Dos-Box

Fabian83

Mitglied
Hallo zusammen,

ich habe ein Problem bei der Übergabe von Befehlen an eine DOS Box, die über ein Java Programm geöffnet wurde.
Ich würde gerne einfach einen String ( etwa in der Art "\Programmname<Inputfile_für_Programm") übergeben um ein Fortran Programm mit Übergabeparametern zu starten.Es wird jedoch, wenn ich dies übergebe, nur das Programm ausgeführt ohne den Input.
Es macht also keinen unterschied ob ich nur "\Programmname" oder "\Programmname<Inputfile_für_Programm" schreibe.

Java:
       File WKD = new File(D:\Ordner1\);
	ProcessBuilder p = new ProcessBuilder("cmd", "/c", "start",[B]"Programmname"[/B]);
//so klappt es, allerdings klappt der Befehl "Programmname<Inputfile" welcher unter DOS korrekt ist nicht
			p.directory(WKD);
			p.start();
[code=Java]

Vieln Dank für die Hilfe!
 
Ins blaue geraten: Vielleicht noch Anführungszeichen oder so...?
Vorher
String s = "programm < inputFile";
Nachher sowas wie
String s = "\"programm < inputFile\"";

(BTW: Ich hab' den Processbuilder noch nie isoliert verwendet, sonst nur gelgentlich Runtime.exec(...) ...)
 
Ich habe es nun auch nicht probiert aber ich rate mal ins Blaue:
Wenn man
Code:
programm < eingabe.txt
schreibt so biegt man die
Code:
stdin
vom Programm auf die genannte Datei. Wenn du das über Java ausführst, dann "schnappt" sich die VM ggfs die
Code:
stdin
, sprich das "< eingabe.txt" ist wirkungslos?

Mit Java7 hat der ProcessBuilder aber auch
Code:
redirectXXX()
-Methoden. Du könntest probieren hierüber die eingabe.txt anzugeben.
 
@ Marco: Das hat leider nichts genützt, trotzdem Danke.
Ich habe jetzt das Problem gelöst und zwar über einen thread der die Kontrolle der cmd-Box an die Java Console umleitet. Den Code habe ich übernommen, deswegen ist er mir nicht ganz klar. Vielleicht kann mir hier einer weiterhelfen. Ich rufe von meiner Gui bei einer bestimmten Eingabe den Code unten auf, der dann über cmd wiederum das gewünschte Programm aufruft.
Nun würde ich gern bei beenden des Programms, d.h. cmd steht wieder auf dem Working Directory, die Kontrolle zurück an meine GUI geben. Momentan funktioniert das nicht.
Java:
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;


public class InnExec {
	String wkdir;
	static String ActCommand;//Das Programm das ausgeführt werden soll, Übergabe von GUI
	static String InFile;
	
	InnExec(String wkdir, String ActCommand, String InFile) {
		InnExec.ActCommand=ActCommand;
		this.wkdir=wkdir;
		InnExec.InFile=InFile;
	}
	public void Run() throws IOException, InterruptedException {
	File wkdir=new File(this.wkdir);
	  ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe").redirectErrorStream(true);
	  processBuilder.directory(wkdir);
	  Process process = processBuilder.start();
	  
  createAndStartProcessOutputHandlerThread(process);
  Thread processInputHandlerThread = createAndStartProcessInputHandlerThread(process);
  process.waitFor();
  processInputHandlerThread.interrupt();
	}
	private static Thread createAndStartProcessInputHandlerThread(final Process process) {
	    Thread thread = new Thread(new Runnable() {
	      public void run() {
	        PrintWriter printWriter = new PrintWriter(process.getOutputStream());
	        //Scanner scanner = new Scanner(System.in);
	        try {
	            printWriter.println(ActCommand+"<"+InFile);
	            printWriter.flush();
	            Thread.sleep(50);
	          }
	         catch (InterruptedException interruptedException) {
	          // ignore Process shutdown
	        }
	        
	      }
	    });
	    thread.start();
	    return thread;
	  }
	 
	 
	  private static Thread createAndStartProcessOutputHandlerThread(final Process process) {
	    Thread thread = new Thread(new Runnable() {
	      public void run() {
	        try {
	          char c = Character.MAX_VALUE;
	          while ((c = (char) process.getInputStream().read()) != Character.MAX_VALUE) {
	           System.out.print(c);
	           // Ausgabe auf Java Console
	          }
	          System.out.print(c);
	        } catch (IOException e) {
	          e.printStackTrace();
	        }
	      }
	      
	    });
	    thread.start();
	    return thread;
	  }
	 
}
 
cmd steht wieder auf dem Working Directory, die Kontrolle zurück an meine GUI geben. Momentan funktioniert das nicht.

Das ist keine Fehlerbeschreibung😉

Ich auch mal auf's Blaue raten.

Wenn das externe Programm in der Kommandozeile fertig ist, läuft danach aber immer noch die CMD-Shell. Das Java-Programm wartet darauf, dass dieses beendet wird (waitFor). Also die Shell über exit beenden, dann müsste auch die GUI weitermachen.

Oder cmd /c <Kommando> aufrufen, dann beendet sich die Shell automatisch nach Abarbeitung von <Kommando>
 

Neue Themen


Zurück
Oben