2009-03-30 6 views
9

Sous OS X, j'essaie d'obtenir quelque chose .exec, mais lorsqu'un chemin contient un espace, cela ne fonctionne pas. J'ai essayé d'entourer le chemin de guillemets, d'échapper à l'espace, et même d'utiliser \ u0020.Les espaces dans Java exécutent le chemin d'accès pour OS X

Par exemple, cela fonctionne:

Runtime.getRuntime().exec("open /foldername/toast.sh"); 

Mais s'il y a un espace, aucun de ces travaux:

Runtime.getRuntime().exec("open /folder name/toast.sh"); 

Runtime.getRuntime().exec("open \"/folder name/toast.sh\""); 

Runtime.getRuntime().exec("open /folder\\ name/toast.sh"); 

Runtime.getRuntime().exec("open /folder\u0020name/toast.sh"); 

Idées?

Éditer: barre oblique inverse échappée ... toujours pas de travail.

Répondre

11

Il y a un résumé de ce problème sur Sun's forums ... semble être un problème assez commun ne se limite pas à OS X.

Le dernier message dans le fil résume la solution proposée. En substance, utilisez la forme de Runtime.exec qui prend un tableau String[]:

String[] args = new String[] { "open", "\"/folder name/toast.sh\"" }; 

ou (le forum suggère que cela fonctionne aussi)

String[] args = new String[] { "open", "folder name/toast.sh" }; 
+0

Merci! Pour info j'ai eu quelques drapeaux supplémentaires dans le vrai programme et si vous utilisez un tableau comme celui-ci, vous devez alors tout casser. Exemple: String [] args = new Chaîne [] {"open", "-n", "nom du dossier/toast.sh"}; – Alan

+0

Lien mort maintenant :(quelqu'un sait où je peux trouver un lien de remplacement? – Joe

1

Essayez ceci:

Runtime.getRuntime().exec("open /folder\\ name/toast.sh"); 

« \ » va juste mettre un espace dans la chaîne, mais « \ » va mettre un « \ » dans la chaîne, qui sera transmis à la coquille, et shell va échapper à l'espace.

Si cela ne fonctionne pas, transmettez les arguments sous la forme d'un tableau, un élément pour chaque argument. De cette façon, le shell ne s'implique pas et vous n'avez pas besoin d'échappées bizarres.

Runtime.getRuntime().exec(new String[]{"open", "/folder name/toast.sh"}); 
+0

oups, qui était une faute de frappe de ma part, je l'ai essayé et cela ne fonctionne pas. – Alan

0

option de Paul fonctionne, mais vous devez toujours échapper aux espaces comme si:

Runtime.getRuntime().exec(new String[]{"open", "/folder\\ name/toast.sh"}); 

La chose qui aspire à utiliser un tableau de chaînes est que chaque param et son choix doit être dans leur propre élément. Par exemple, vous ne pouvez pas le faire:

Runtime.getRuntime().exec(new String[]{"executable", "-r -x 1", "/folder\\ name/somefile"}); 

mais doit le spécifier ainsi:

Runtime.getRuntime().exec(new String[]{"executable", "-r", "-x", "1", "/folder\\ name/somefile"});