# Probleme mit Runtime.exec und Leerzeichen



## phish (20. Jul 2009)

Hallo,
ich möchte aus Java heraus einen Command ausführen lassen. Dies funktionert auch ohne Probleme, solange ich in den Parametern keine Leerzeichen habe


```
String folder = "C:\Lokale Daten\Vorname.Nachname";
String file = "name.xyz";
String[] cmds = new String[] { "command", "-param1=bla", "-file=\""+folder+"\\"+filename+"\"" };

try {
  Process pro = Runtime.getRuntime().exec(cmds);
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
```

Problem ist folgendes: durch das Leerzeichen zwischen Lokale Daten übergibt er: 
c:\>command -param1=bla *"*-file="C:\Lokale Daten\Vorname.Nachname\name.xyz"*"*

Wie bekomme ich die Anführungszeichen dort weg? Im Endeffekt soll es so aussehen:

c:\>command -param1=bla -file="C:\Lokale Daten\Vorname.Nachname\name.xyz"


----------



## faetzminator (20. Jul 2009)

phish hat gesagt.:


> Problem ist folgendes: durch das Leerzeichen zwischen Lokale Daten übergibt er:
> c:\>command -param1=bla *"*-file="C:\Lokale Daten\Vorname.Nachname\name.xyz"*"*



Wie kommst du auf das?
Versuchs einfach mal mit "-file=ich bin ein Pfad" und mit "-file=\"ich bin ein Pfad\"", eine der zwei Methoden sollte funktionieren. Warum du im Pfad noch weitere " mitgibst kann ich mir nicht erklären.


----------



## phish (20. Jul 2009)

```
String[] cmds = new String[] { "command", "-param1=bla", "-file=ich bin ein pfad" };
```
ergibt: c:\>command -param1=bla *"*-file=ich bin ein pfad*"*


```
String[] cmds = new String[] { "command", "-param1=bla", "-file=\"ich bin ein pfad\"" };
```
ergibt: c:\>command -param1=bla *"*-file="ich bin ein pfad"*"*

Und das ist ja genau mein Problem. Ich will die zusätzlichen Leerzeichen loswerden.


----------



## faetzminator (20. Jul 2009)

Eigentlich sollte [c]Runtime.getRuntime().exec(String[])[/c] bewirken, dass jedes Element als Parameter an das Programm geschickt wird. Wie das diese dann im aufzurufenden Programm gehandelt werden, musst du selber herausfinden. Wie funktioniert denn ein Commandlineaufruf dessen? Wie sieht die Syntax (mit ") genau aus? Ansonsten musste ich schon " " durch "%20" ersetzen (unter Windoof...).


----------



## SlaterB (20. Jul 2009)

wie läßt sich denn überhaupt feststellen, ob zusätzliche Anführungszeichen da sind oder nicht?


----------



## phish (20. Jul 2009)

```
String[] cmds = new String[] { "command", "-param1=bla", "-file=\""+folder.replace(" ","%20")+"\\"+filename.replace(" ","%20")+"\"" };
```

löst das Problem mit den Leerzeichen. Allerdings ist der Parameter dann falsch, und mein Programm kann mit dem "%20" nix anfangen. Da muss schon ein Leerzeichen hin. Ich frage mich, ob man nicht unterdrücken kann, dass er die " erzeugt. Das waere ja meine Ideallösung.


----------



## faetzminator (20. Jul 2009)

Zeig uns doch, wie der Kommandozeilenaufruf deines Programmes ausschaut, welcher funktioniert. Hast du das überhaupt schon mal versucht? Vielleicht funktioniert das nicht. Wenn das Programm überhaupt keine Leerzeichen parst, könnte man es mit "\"-file=irgendein pfad\"" versuchen.


----------



## phish (20. Jul 2009)

In der Ausgabe sehe ich ja:

_java.io.IOException: CreateProcess: command -param1=bla "-file="C:\Lokale Daten\Vorname.Nachname\name.xyz"" error=2_

Da sehe ich ja, dass er zusätzliche Anführungszeichen erzeugt.

Bei faetzminators Lösung sehe ich:

_java.io.IOException: CreateProcess: command -param1=bla -file="C:\Lokale%20Daten\Vorname.Nachname\name.xyz" error=2_

Also keine Anführungszeichen!


----------



## phish (20. Jul 2009)

Der direkte Aufruf in der Kommandozeile: 
_command -param1=bla -file="C:\Lokale Daten\Vorname.Nachname\name.xyz"_ 
läuft einwandfrei.


----------



## faetzminator (20. Jul 2009)

Ich behaupte, diese macht er lediglich in der Ausgabe, damit du als Programmierer siehst, dass dies ein Arrayelement ist.


----------



## phish (20. Jul 2009)

Das könnte natürlich sein.
Woran könnte es dann liegen?

Ich bekomme ja die _java.io.IOException: CreateProcess:_.
Was er anzeigt funktioniert ja einwandfrei, wenn ich es händisch ausführe.

Ich schiebe mal alles in ein Verzeichnis ohne Leerzeichen und teste mal.


----------



## faetzminator (20. Jul 2009)

Und *wie genau* führst du es händisch aus?


----------



## phish (20. Jul 2009)

phish hat gesagt.:


> Der direkte Aufruf in der Kommandozeile:
> _command -param1=bla -file="C:\Lokale Daten\Vorname.Nachname\name.xyz"_
> läuft einwandfrei.



So 

das exec müsste ja 1 zu 1 das selbe anstoßen.

Gebt mir 10min, ich teste gerade mal ohne Leerzeichen.


----------



## phish (20. Jul 2009)

Okay, es liegt nicht an den Leerzeichen. Jetzt bin ich schonmal einen ganzen Schritt weiter.

Aber meine Methode


```
Process pro = Runtime.getRuntime().exec(cmds);
```

ist doch prinzipiell richtig, oder sehe ich das falsch?


----------



## faetzminator (20. Jul 2009)

Versuchs mal mit dem ganzen Pfad zur Binary. Also statt "command" einfach "X:/folder/command" verwenden. Kann sein, dass die Umgebungsvariable da irgendwie anders ist (!?).


----------



## Spacerat (20. Jul 2009)

Der String den du suchst müsste laut Beispiel so aussehen
	
	
	
	





```
"\"C:\\Lokale Daten\\Vorname.Nachname\""
```
@Edit: Bei erneutem überlegen, natürlich ohne die Ganterpranken 

```
]"C:\\Lokale Daten\\Vorname.Nachname"
```


----------

