J'ai le fichier de commandes Windows suivant (Run.bat):
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "run.bat", "Some Input With Spaces", ">>", "stdout.txt","2>>", "stderr.txt");
3 Réponses :
Utilisez Cela semble être un bugfix en fait - la nouvelle mise en œuvre a du sens. P> getOutputStream () code> sur le processus, au lieu d'utiliser
system.out.println () code>. Parfois, la sémantique change entre les implémentations Java. P>
Plusieurs suggestions ici:
p> p> p>
run.bat code> wrapper qui fera les redirections? LI>
ul>
Le processus exécuté peut être long. Si je lisais la sortie du processus dans le processus Java et que cela meurt, la sortie de processus sera mise en mémoire tampon et finalement, le processus externe s'arrêtera. Le processus Java ne doit pas interférer avec l'externe de quelque manière que ce soit. C'est pourquoi la tuyauterie dans le fichier doit être effectuée par le système d'exploitation, en quelque sorte.
En ce qui concerne les espaces dans l'entrée, toute option est possible. La ligne de commande est configurée à l'aide d'une liste
Créer un script wrapper est une option, mais le script devra être dans le même répertoire que le script externe (au cas où il existe des fichiers supplémentaires et des répertoires de répertoires dans le script). Ceci est "sale" - je veux exécuter le code de manière non agrégée que possible et ajouter des fichiers générés peut être problématique.
L'utilisation d'un script wrapper semble être le seul moyen de le faire de manière portable pour JDK 6, ce qui corrige ainsi cette réponse.
@Barak Vous avez écrit que le processus à la main est longuant. Serait-il logique de l'enregistrer en tant que service Windows?
Pas nécessairement. L'utilisateur final du système définit le script, de sorte que nous ne savons pas à l'avance ce qu'il fait. L'utilisateur configurez le planificateur de tâches ou un service Windows s'il veut
C'est la méthode la plus simple que j'ai trouvée sur http: //tamanmohamed.blogspot.in/2012/06/jdk7-processbuilder-and-how-redirecting.html
La méthode RedirectOutput n'est disponible que chez Java 7 et cela doit également fonctionner sur Java 6.
Le lien ne fonctionne plus
Cela vous aide-t-il à combiner toutes les lignes de commande arguments à droite de
\ C code> dans un seul arg?
Cela ne fonctionne que si je n'ai aucun espaces dans les arguments passés au script.
Voir aussi ProcessBuilder: expéditeur STDOUTER et STDERR de processus de démarrage sans Blocage du fil principal