Commande Java Runtime.getRuntime().exec() dans Mac OS
Im à l'aide de Mac OS Lion, avec la version java 1.6.0_26
Je suis en train de faire une petite application pour Mac en Java avec un menu principal pour l'utilisateur, alors il peut choisir plusieurs options.
L'un d'eux est d'installer une application à l'aide d'un .pkg
Tout fonctionnait 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 j'ai réalisé qu'il ya un problème quand foldername a des espaces ou si je copie ce fichier java avec des sous-dossiers pour une clé USB avec "NO NAME" (ou quelque nom avec des espaces).
En raison de la volonté de devenir quelque chose comme:
ouvrir /Volumes/NO NOM/nomdossier/appInstaller.pkg
ou
ouvrir /Utilisateurs/user1/Bureau/nom du dossier/appInstaller.pkg
Ainsi, lorsque vous exécutez le p processus, la commande va finir où le premier espace apparaît sur le chemin
ouvrir /Volumes/NO
ou
ouvrir /Utilisateurs/user1/Desktop/dossier
Pour essayer de résoudre ce problème, j'ai changé la définition de quelque chose comme ceci:
String s = "open "+ "\"" + instFolder.toString() + "\"";
Il a cessé de travailler bien. La chose étrange est que si je copie la valeur s (après la création de la variable s) et le coller dans le terminal, ça fonctionne:
ouvrir "/Users/user1/Bureau/nom du dossier/appInstaller.pkg"
mais l'exécution de Java il ne fonctionne pas.
Pourriez-vous m'aider, s'il vous plaît?
Grâce.
Vous devez vous connecter pour publier un commentaire.
Afin d'échapper correctement les arguments, vous pouvez utiliser les éléments suivants:
Bien que je serais probablement utiliser la plus moderne ProcessBuilder:
Si cette peut être intéressant à lire en fonction de ce que vous voulez faire avec le processus de sortie.
Note: édité à réfléchir à la question en commentaire
Runtime.exec
méthode utiliseProcessBuilder
, je ne dirais pas que l'un est "plus moderne" que l'autre.il semble que votre chemin d'accès n'ont pas de guillemets lorsqu'il est dans la coque.
Vous devriez ajouter "'" sur les deux côtés de votre chemin, de sorte que la finale de la commande shell va ressembler:
au lieu de
Voici un petit truc qui sort de l'réponses mentionnées ci-dessus:
Dire
commandString = "killall Mail"
puis la séparation de séparer les mots en faisant unString[]
paramètre à laProcessBuilder
.