2011-11-02 6 views
4

je suis sous Mac OS Lion, avec la version Java 1.6.0_26Java commande Runtime.getRuntime(). Exec() dans Mac OS

Je fais une petite application pour Mac en Java avec un menu principal pour l'utilisateur, afin qu'il puisse choisir plusieurs options.

L'un d'eux est d'installer une application en utilisant un .pkg

Tout fonctionnait très bien avec ces commandes:

File instFolder = new File(System.getProperty("user.dir") + "/foldername/appInstaller.pkg"); 
String s = "open "+ instFolder.toString(); 
Process p = Runtime.getRuntime().exec(s); 

Puis je me suis aperçu qu'il ya un problème quand foldername a des espaces ou si je copie ce fichier java avec les sous-dossiers nécessaires à un stylo USB avec "NO NAME" comme nom (ou un nom avec des espaces).

Parce que s deviendra quelque chose comme:

ouvert/Volumes/NO NAME/foldername/appInstaller.pkg
ou
ouvert/Utilisateurs/user1/nom de bureau/dossier/appInstaller.pkg



Ainsi, lorsque vous exécutez le processus p, la commande se terminera lorsque le premier espace apparaît sur le chemin

ouvert/Volumes/NO
ou
ouverts/Utilisateurs/user1/Desktop/dossier


Pour essayer de résoudre ce problème, je changé la définition de s pour quelque chose comme ceci:

String s = "open "+ "\"" + instFolder.toString() + "\""; 

Il est arrêté fonctionne bien. La chose étrange est que si je copie la valeur s (après avoir créé la variable s) et le coller dans le terminal, il fonctionne:

ouvert «/Users/utilisateur1/Desktop/Nom du dossier/appInstaller.pkg »

Mais en cours d'exécution à partir de Java, cela ne fonctionne pas.

Pourriez-vous m'aider, s'il vous plaît?

Merci.

Répondre

5

Pour échapper correctement les arguments, vous pouvez utiliser ce qui suit:

Runtime.getRuntime().exec(new String[] { "open", instFolder.toString() }); 

Bien que je serais probablement utiliser le plus moderne ProcessBuilder:

ProcessBuilder pb = new ProcessBuilder("open", instFolder.toString()); 
Process p = pb.start(); 
int exitCode = p.waitFor(); 

Bien que this vaut peut-être une lecture en fonction de ce que vous voulez faire avec la sortie de processus.

Note: modifiée pour refléter la question dans le commentaire

+0

Bonjour @ beny23: Merci pour vos suggestions. Ils ont tous deux bien travaillé, mais j'ai une question. Supposons que le dossier instFolder est erroné, alors quand j'essaye d'exécuter le programme d'installation, le processus renverra un code de sortie <> 0 pour que je sache qu'une erreur s'est produite. Comment puis-je vérifier cela avec le constructeur de processus? – user897013

1

il semble que votre chemin n'a pas de guillemets lorsqu'il est transformé en shell.

Vous devriez probablement ajouter "'" des deux côtés de votre chemin, de sorte que la commande shell final ressemblera:

open 'your path' 

au lieu de

open your path 
+0

Salut @Nicolas:
C'est ce que j'ai essayé de faire quand je modifie la définition de s variableString s = "open" + "\" "+ instFolder.toString() +" \ ""; – user897013

+0

Merci quand même pour votre réponse. – user897013

0

Voici un petit truc qui est sorti des réponses mentionnées ci-dessus:

ProcessBuilder pb = new ProcessBuilder(commandString.split(" ")); 

Say commandString = "killall Mail" alors la scission se séparera les mots qui en fait un paramètre String[] au ProcessBuilder.

Questions connexes