# Runtime.getRuntime().exec()



## walidadil (9. Jun 2009)

Hallo Java experten ,
 ich will von Java ein CommandLine ausführen , wenn ich das mit Dos Box ausführe , funktioniert wunderbar .
aber wenn ich das durch Runtime.getRuntime().exec()  funktioniert irgendwie nicht , ich weiss nicht was ich falsch mache.


```
Process p = Runtime.getRuntime().exec("C:\\Program Files\\IXOS\\bin\\dsClient <client.cmd > bh.log" );
```

mit < eingabe umleitung bzw. > ausgabe umleitung.

ich bin sehr Dankbar für jedes Hinweis.


----------



## KlinCh (9. Jun 2009)

exec() führt nur _ein_ programm aus.
Die Umleitungen sind aber Funktionen der CMD und werden somit nicht funktionieren.

Du könnstest versuchen cmd.exe zu starten und dann als paramter den gesammten befehl zu geben. (ich weiss jetzt nicht wie das bei windows aussieht, aber unter linux könntest du zum beispeil mit "sh -c 'ech test> test.txt'" es machen.


----------



## walidadil (9. Jun 2009)

Hi , 
Danke für deine schnelle Antwort , ich habe  auch versucht cmd.exe zu starten und dann als paramter den gesammten befehl zu geben aber leider hat es auch nicht funktioniert , ich habe so probiert :

```
Process p = Runtime.getRuntime().exec("cmd /s /c \"\"C:\\Program Files\\IXOS\\bin\\dsClient.exe\" <client.cmd >C:\\iuvatec\\archive.log\"");
```

ich arbeite  schon seit 2 Tagen dran aber erfolglos :noe: .
Danke im vorraus an alle.
Gruß


----------



## Wildcard (9. Jun 2009)

Es hindert dich auch nichts daran die Streams selbst umzuleiten.


----------



## walidadil (9. Jun 2009)

Hi , 
wie kann ich  die Streams selbst umleiten?  meinst du direkt von Dos BOX ??


----------



## Wildcard (9. Jun 2009)

Process Objekte haben InputStreams, OutputStreams und ErrorStreams auf die du Zugreifen kannst. Es steht dir also frei mit diesen Streams zu tun was auch immer du möchtest.


----------



## musiKk (9. Jun 2009)

Also wenn, dann als Array. Parameter werden standardmäßig an Whitespace getrennt, das ist hier aber nicht richtig, da das Kommando, welches an cmd übergeben werden soll, auch Leerzeichen enthält.

```
exec(new String[]{"cmd", "/s", "/c", "\"\"C:\\Program Files\\IXOS\\bin\\dsClient.exe\" <client.cmd >C:\\iuvatec\\archive.log\""};
```
Oder so.

Würde aber nach Möglichkeit auch den Vorschlag von Wildcard bevorzugen. Die Streams für Ein- und Ausgabe erhältst Du aus dem Prozess-Objekt, welches von exec() erzeugt wird.


----------



## walidadil (10. Jun 2009)

Hi , 
 ich habe mit erste vorschlaglösung versucht aber leiderhat es nicht funktioniert und  ich kriege auch keine Fehlermeldung .
 zweite Vorschlaglösung habe ich gemacht aber 
:
	
	
	
	





```
public class Test {
	  public static void main(String[] args) throws Exception {
		
		  try{
		  
		  Runtime rt = Runtime.getRuntime();
		  Process proc = rt.exec("C:\\Program Files\\IXOS\\bin\\dsClient.exe <client.cmd >C:\\iuvatec\\koko.log"); 
		  InputStream stderr = (InputStream) proc.getErrorStream();
		  InputStreamReader isr = new InputStreamReader(stderr);
		  BufferedReader br = new BufferedReader(isr);
		  String line = null ;
		  System.out.println("<ERROR>");
		  while ((line = br.readLine())!= null )
			  System.out.println(line);
		  }
		  
		  catch (Throwable t) {
			t.printStackTrace();  
		  }
		  
		  		

	  }
	}
```

und ich kriege folgende Fehlermeldung :

```
java.io.IOException: CreateProcess: C:\Program Files\IXOS\bin\dsClient.exe <client.cmd >C:\iuvatec\koko.log error=193
	at java.lang.ProcessImpl.create(Native Method)
	at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
	at java.lang.ProcessImpl.start(ProcessImpl.java:30)
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:451)
	at java.lang.Runtime.exec(Runtime.java:591)
	at java.lang.Runtime.exec(Runtime.java:429)
	at java.lang.Runtime.exec(Runtime.java:326)
	at Test.main(Test.java:24)
```

Gruß


----------



## musiKk (10. Jun 2009)

Neja, der Name des Prozesses hört nach dem ".exe" auf. Das "<"- und ">"-Gedings ist doch gerade die Umlenkung der Ein- und Ausgabeströme, die Du in Java mittels getInputStream() und getOutputStream() realisieren sollst (bzw. kannst).


----------



## walidadil (10. Jun 2009)

Hi musikK,
Danke für deine schnelle antwort , ich bin noch java anfänger , kannst du mir vielleicht irgend klein java code  beispiel geben ?

Danke im Vorraus

Gruß


----------



## Saxony (10. Jun 2009)

Hiho,


```
public class RuntimeExecute {

	public void execute(String aCommand) {

		try {

			Runtime rt = Runtime.getRuntime();

			Process proc = rt.exec(aCommand);

			ExecuteStream errorStream = new ExecuteStream(proc.getErrorStream());

			ExecuteStream outputStream = new ExecuteStream(proc
					.getInputStream());

			errorStream.start();
			outputStream.start();

		} catch (Throwable t) {

			t.printStackTrace();
		}
	}

	public static void main(String[] args) {

		RuntimeExecute exec = new RuntimeExecute();

		exec.execute("cmd.exe /C dir");

		exec.execute("cmd.exe /C set");
	}
}

class ExecuteStream extends Thread {

	InputStream is;

	ExecuteStream(InputStream aIS) {

		super("Console");
		this.is = aIS;
	}

	public void run() {

		try {

			InputStreamReader isr = new InputStreamReader(this.is);
			BufferedReader br = new BufferedReader(isr);
			String line = null;

			while ((line = br.readLine()) != null) {

				System.out.println(line);
			}
		} catch (IOException ioe) {

			ioe.printStackTrace();
		}
	}
}
```

Ansonsten kannste auch mal hier weiterlesen:

When Runtime.exec() won't - JavaWorld

bye Saxony


----------

