9
votes

Comment puis-je sortie de processus de tuyau à un fichier sur Windows et JDK 6U45

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 commentaires

Cela vous aide-t-il à combiner toutes les lignes de commande arguments à droite de \ C 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


3 Réponses :


0
votes

Utilisez getOutputStream () sur le processus, au lieu d'utiliser system.out.println () . Parfois, la sémantique change entre les implémentations Java.

Cela semble être un bugfix en fait - la nouvelle mise en œuvre a du sens.


0 commentaires

4
votes

Plusieurs suggestions ici:

  • Est-ce que l'entrée avec les espaces doit être traitée comme une chaîne unique (avec des espaces) ou une identité dans plusieurs entrées? Si la première option est le cas, je suggérerais de le citer pour le temps d'exécution Windows:

    xxx

    • au lieu de rediriger l'entrée sur stdout.txt et stardr.txt à l'aide de la coquille, pourquoi ne pas le faire à l'aide de Java à l'aide de GetOutPutStream () et getterRorstream ()? Voici un exemple utilisant le paquet IO de GUAVA. Bien sûr, vous voudrez peut-être avoir ceux dans des threads séparés, vous avez besoin d'une bonne manipulation des exceptions, etc.

      xxx

      • Une autre option, pourquoi ne pas créer un run.bat wrapper qui fera les redirections?

        xxx


6 commentaires

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 , permettant une combinaison à une combinaison. Avec le JDK pré-6u45, la mise en œuvre du processus de processbuilder a fonctionné comme ceci sans aucun problème.


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



17
votes

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
XXX


2 commentaires

La méthode RedirectOutput n'est disponible que chez Java 7 et cela doit également fonctionner sur Java 6.


Le lien ne fonctionne plus