2009-12-15 5 views
2

J'ai une application de console et une application de formulaires gagnants qui doivent tous deux appeler un serveur distant pour certaines données, ils font un appel à la partie ligne de commande de Putty, plink .exe, pour exécuter une commande à distance sur SSH.Process.WaitForExit() sur la console vs Windows Forms

J'ai créé une minuscule bibliothèque de classe pour les deux à partager, en cours d'exécution suivantes:

public static string RunCommand(string command, string arguments) { 
    ProcessStartInfo startInfo = new ProcessStartInfo { 
     FileName = command, 
     Arguments = arguments, 
     UseShellExecute = false, 
     CreateNoWindow = true, 
     RedirectStandardOutput = true 
    }; 
    string output = null; 
    using (Process p = new Process()) { 
     p.StartInfo = processStartInfo; 
     p.Start(); 
     output = p.StandardOutput.ReadToEnd(); 
     p.WaitForExit(); 
    } 
    return output; 
} 

Dans l'application de la console tout fonctionne bien, sous la victoire forme, il ne l'erreur pas, il semble que WaitForExit() n'attend pas. Je reçois une chaîne vide pour la sortie. J'ai confirmé à partir du serveur distant que l'utilisateur s'est connecté, il semble donc que la commande a été exécutée.

Des idées?

+0

Où votre fonction est appelée? –

+0

J'ai essayé les deux dans Program.Main() et le ctor de la forme principale avec les mêmes résultats. – Gavin

+2

Envisagez de lire 'p.StandardError' - même si c'est juste pour être sûr que la commande s'est bien déroulée comme prévu. –

Répondre

5

Sous Windows Les applications console ont STDIN, STDOUT et STDERR. Les applications fenêtrées ne le font pas. Lorsque vous créez un processus sous une application de console, les fichiers STDIN etc. sont hérités par l'application enfant. Cela ne se produit pas dans l'application fenêtrée.

Le RedirectStandardInput=true fonctionne car il permet au système de créer un enregistreur pour le STDIN que vous pouvez utiliser pour envoyer une entrée au processus enfant. Dans votre cas, l'enfant n'a pas besoin de l'entrée, il a juste besoin de la présence de l'entrée. YMMV.