2010-10-22 6 views
2

Dans mon code C#, je dois exécuter des processus externes. Ceux-ci peuvent être des fichiers batch ou des exécutables. Je redirige la sortie à une fenêtre de moi-même en ayant RedirectStandardOutput du ProcessStartInfo être vrai. Cela permet à l'utilisateur de revoir la sortie même après la fin du processus externe. Je redirige également l'entrée afin que l'utilisateur puisse appuyer sur les touches si nécessaire. Cela fonctionne très bien en général.RedirectStandardOutput et la commande pause dans les fichiers batch

Cependant, j'ai un problème. Certains fichiers de traitement par lots utilisent la commande PAUSE. Apparemment, la sortie n'est pas vidée par la commande tant qu'une touche n'a pas été pressée. Ainsi, l'utilisateur ne voit jamais l'invite. Donc, seulement après qu'une touche a été pressée, l'utilisateur verra qu'il aurait dû appuyer sur une touche pour continuer. Y at-il un moyen de faire ce travail (en dehors de "Ne pas utiliser PAUSE")?

EDIT: Les fichiers batch exécutent le post-processeur CAM de l'utilisateur et sont généralement créés par l'utilisateur (ou le service informatique de l'utilisateur). Donc, nécessitant des changements à ces fichiers ou "piratage" en créant un pause.exe ne sont pas des solutions vraiment viables (sauf en dernier recours).

Répondre

4

Dans CMD, Essayez

batchWithPause.bat < nul 

En C# qui serait quelque chose comme:

Process.Start("batchWithPause.bat", "< nul"); 

EDIT Donc, vous voulez simplement à l'utilisateur de voir "Appuyez sur une touche pour continuer"? Ensuite, ajoutez

@echo "Press any key to continue..." 

avant chaque appel pause. Vous pouvez également:

  1. Écrivez votre propre pause.bat qui le fait essentiellement
  2. Ecrire un pause.exe simple, dire C#:

    public static void Pause() { Console. WriteLine ("Appuyez sur Entrée pour continuer."); Console.Read(); }

EDIT 2 Je comprends votre problème maintenant. Les deux fichiers asynchrone OutputDataReceived et StreamReader.ReadLine() liraient "Appuyez sur n'importe quelle touche pour continuer" une fois que l'utilisateur a appuyé sur une touche. Cependant, si vous deviez boucler StreamReader.Read() vous-même, vous obtiendriez également le message "Appuyez sur n'importe quelle touche pour continuer". Donc, cela semble être votre seul itinéraire possible.

+0

Ceci redirige l'entrée, de sorte que la commande de pause est ignorée. Mais je veux que la commande pause fonctionne (et c'est le cas). Le problème est que le texte n'est pas écrit en sortie, donc l'utilisateur ne sait pas appuyer sur une touche pour continuer. –

+0

@Daniel Voir ma modification. Je ne sais pas pourquoi le balisage est faux dans l'implémentation de pause() –

+0

Malheureusement, les fichiers batch sont fournis par l'utilisateur (ils exécutent le post-processeur CAM). Remplacer la commande de pause (ou leur dire "Ne pas utiliser de pause") sont deux solutions possibles, mais ni "solution" n'est vraiment ce que je voudrais faire. –

Questions connexes