2010-09-10 3 views
0

J'essaie d'exécuter un fichier batch dans mon application Java. Le code est le suivant:Problème lors de l'exécution d'un fichier batch en Java

Runtime.getRuntime().exec("cmd /C start C:/Documents and Settings/Zatko/My Documents/Project-Workspace/IUG/external/apps/archive/run-server.bat"); 

Quand il exécute, une boîte de dialogue d'erreur apparaît indiquant « Windows ne peut pas trouver « C:/Documents ». Assurez-vous que vous avez saisi le nom corretly .... »

Lorsque J'exécute avec le même code un autre fichier batch, nommé fichier.bat et situé dans le dossier C:/Temp, il fonctionne parfaitement ....

Est-ce que quelqu'un sait où le problème peut être? S'agit-il de l'espacement des caractères?

Merci à l'avance

Répondre

2

Edit:

Il semble que la commande de démarrage a besoin d'un paramètre supplémentaire à chaque fois que le chemin vers l'exécutable pour commencer est enfermé dans cette « Comme il faut entourer les paramètres qui contient des espaces par. » est un peu déroutant car le comand de départ fonctionne comme excepté quand on a un chemin sans espaces et donc ne l'entoure pas. "C'est ce qui est arrivé quand j'ai testé le code ci-dessous pour un dossier c:/temp

Le paramètre en charge est un titre pour la fenêtre que j'ai s ouvert. Il doit venir deuxième paramètre et s'il contient des espaces doivent être entourés par "

Je suggère d'utiliser toujours" pour le titre et le chemin.

Voici donc la commande mise à jour:

Vous devez joindre

c:./Document and Settings/...

avec "comme nom de fichier contient des espaces et vous devez inclure un titre lorsque vous utilisez la commande de démarrage avec un paramètre avec ".

Pour Java qui serait:

Runtime.getRuntime() exec (serveur "cmd/C start \" \ "\" C:./Documents and Settings /Zaťko/Mes Documents /Project-Workspace/IUG/external/apps/archive/run-server.bat \ "");

Greetz, Ghad

+0

J'ai suivi les instructions. Cependant lorsque je vais exécuter le code, la fenêtre de commande DOS apparaît avec le curseur clignotant à C: \ Documents and Settings \ Zatko \ Mes documents \ Project-Workspace \ IUG \> – Anto

+0

Vérifiez si votre serveur a déjà été démarré. Mai le fichier de commandes démarre un processus qui laisse la fenêtre de commande ouverte. Lorsque j'essaie avec un lot contenant uniquement la commande pause, cela fonctionne parfaitement ici. – GHad

+0

Non, le serveur n'est pas démarré ... – Anto

2

Il est préférable d'utiliser un tableau:

String[] array = { ... }; 
Runtime.getRuntime().exec(array); 

comme dans

String[] array = { "cmd", "/C", "start", 
    "C:/Documents and Settings/Zatko/My Documents/.../run-server.bat" }; 
Runtime.getRuntime().exec(array); 

avec un tableau est particulièrement important si vous avez des espaces dans un des paramètres, comme vous le faites.

+0

pouvez-vous donner un exemple de l'utiliser dans la situation ci-dessus? –

+0

J'ai certainement pensé la même chose et essayé, mais ça ne marche pas! Il ouvre seulement une fenêtre de commande avec le dossier actuel comme le projet racine (même que mentionné dans le commentaire de Tony ci-dessus) –

+0

J'ai la raison, consultez ma réponse ci-dessous –

0

Cela fonctionne:

List<String> templst = new ArrayList<String>();

templst.add("cmd");

templst.add("/C");

templst.add("start");

templst.add("backup.bat");

Process p = rt.exec(templst.toArray(new String[]{}), null, new File(path));

+0

ne pas essayer d'utiliser/b drapeau, ça ne fonctionne pas dans ce cas. Au lieu de cela, écrivez simplement exit en tant que dernière commande de votre fichier séquentiel. –

2
Runtime.getRuntime().exec("cmd /C start \"\" \"C:/Documents and Settings/Zatko/My Documents/Project-Workspace/IUG/external/apps/archive/run-server.bat\""); 

devrait fonctionner.

Vous devez citer des arguments contenant des espaces ou des métacaractères de shell. Et start s'attend à ce que le premier argument cité soit un titre de fenêtre, alors donnez-en un vide pour qu'il soit heureux.

Questions connexes