2012-09-11 4 views
0

J'utilise le code comme ceci:commande émise par C# ouvre une autre invite de commande

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 

startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "cmd.exe"; 
startInfo.Arguments = "/C SomeEXE inputfile.txt"; 
startInfo.UseShellExecute = false; 
startInfo.RedirectStandardOutput = true; 

process.StartInfo = startInfo; 
process.Start(); 

// Now use streams to capture the output 
StreamReader outputReader = process.StandardOutput; 

process.WaitForExit(); 

String line = outputReader.ReadToEnd(); 

Cela fonctionne très bien. Toutefois, la commande émise (SomeEXE) entraîne l'ouverture d'une autre invite de commande qui contient les résultats réels et attend la fermeture d'un retour chariot. Est-il possible d'obtenir cette sortie et d'émettre un retour chariot? Merci.

Répondre

4

Lancement SomeEXE directement

Si vous lancez SomeEXE directement, plutôt que par un nouvel interpréteur de commandes, votre code existant pour obtenir la sortie en redirigeant stdout à outputReader fonctionnera. Pour ce faire, changer votre code comme suit:

startInfo.FileName = "SomeEXE"; 
startInfo.Arguments = "inputfile.txt"; 

Vous pouvez rediriger stdin à votre propre flux aussi bien pour que vous puissiez émettre le retour chariot:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardinput.aspx

Points clés:

myProcess.StartInfo.RedirectStandardInput = true; 
StreamWriter myStreamWriter = myProcess.StandardInput; 

Écrivez Environment.NewLine à myStreamWriter. Cependant, comme vous ne le faites pas, vous capturez la console de l'interpréteur de commandes.

Si vous contrôlez le code SomeEXE

Si vous avez le contrôle sur SomeEXE, vous pouvez demander à joindre à sa console de parent:

http://www.csharp411.com/console-output-from-winforms-application/

Notez que les exemples MSDN montrent très pauvres gestion des exceptions. Ils ne parviennent pas à fermer les flux dans l'exemple si une exception est levée. Le moyen le plus simple de disposer des flux consiste à les placer dans en utilisant les instructions.

Si SomeEXE génère un processus enfant

Si vous avez aucun contrôle sur le code de SomeEXE et SomeEXE fraie un processus enfant, la tâche de saisir stdin/stdout de la console de petit-enfant est plus difficile. Cependant, cela peut être fait.

Vous avez besoin de obtain the process ID de la fenêtre de console réelle en question. Puis, vous pouvez utiliser l'API Win32 AttachConsole pour attacher la console du processus petitchild à la vôtre.

+0

Je n'obtiens pas la sortie - au moins la chaîne est vide. L'invite de commande "spawned off" contient les données de sortie. La question est comment puis-je obtenir ces données. – cs0815

+1

Oh je vois. Donnez-moi un moment pour considérer cela. –

+0

FYI ... pourquoi lancez-vous SomeEXE via un nouveau shell de commande plutôt que directement comme cible de process.Start()? –

Questions connexes