2010-11-09 19 views
2

J'essaie d'obtenir Mercurial à exécuter dans un shell à partir de mon application C# wpf. Mon but est de récupérer la sortie dans une chaîne afin que je puisse l'analyser.Pourquoi ce code C# ne fonctionne-t-il pas? J'essaie de lire la sortie d'un shell à TortoiseHG (Mercurial)

Malheureusement pour moi, il semble que hg.exe (de tortoiseHg), ne renvoie rien via le code ci-dessous. D'autres .exe semblent fonctionner, comme on le voit dans les commentaires ci-dessous;

Mon code est ci-dessous;

`

 string workingDir = ""; 
     string filename = ""; 
     string param = ""; 

     //This works 
     workingDir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
     filename = "unrar.exe"; 
     param = ""; 

     //this works 
     workingDir = "c:\\program files\\WinRar"; 
     filename = "unrar.exe"; 
     param = ""; 

     //this works 
     workingDir = "C:\\Program Files (x86)\\TortoiseHg"; 
     filename = "docdiff.exe"; 
     param = ""; 

     //this does not work. I get a null returned. Why? 
     workingDir = "C:\\Program Files (x86)\\TortoiseHg"; 
     filename = "hg.exe"; 
     param = ""; 

     //this does not work. I get a null returned. Why? 
     workingDir = "C:\\Program Files (x86)\\TortoiseHg"; 
     filename = "hg.exe"; 
     param = "help"; 

     string retVal = ""; 
     System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
     proc.StartInfo.WorkingDirectory = workingDir;    
     proc.StartInfo.UseShellExecute = false; 
     proc.StartInfo.RedirectStandardOutput = true; 
     proc.StartInfo.FileName = filename; 
     proc.StartInfo.Arguments = param; 
     proc.Start(); 

     System.IO.StreamReader reader = proc.StandardOutput; 
     retVal = reader.ReadToEnd(); 
     System.Windows.MessageBox.Show(retVal);` 

Si quelqu'un pourrait suggérer pourquoi ce code ne fonctionne pas, ou bien une autre méthode de récupération de la sortie des lignes de commande mercuriels, je serais très reconnaissant.

Merci

+0

Il peut être écrit d'erreur standard? – McKay

+0

(Plug sans vergogne) Bonjour, J'ai commencé à travailler sur un wrapper de ligne de commande Mercurial, qui va analyser et convertir toutes les sorties et les commandes de Mercurial en plus de syntaxe C# -y. Si vous êtes intéressé, vous pouvez suivre le projet ici: http://bitbucket.org/lassevk/mercurial.net –

+0

une solution finale avec un exemple de code source complet à ce sujet? – Kiquenet

Répondre

0

Je pense que vous pourriez avoir besoin d'un

proc.WaitForExit(); 

avant votre lecture pour terminer l'appel? À moins que le processus ne soit interactif, vous avez un problème différent.

0

Vous pouvez envisager de manipuler les événements Process.OutputDataReceived et ErrorDataReceived:

proc.ErrorDataReceived += delegate(object o, DataReceivedEventHandler e) 
    { 
     if (e.Data != null) { /* e.Data is the string from the process */ } 
    }; 
proc.OutputDataReceived += delegate(object o, DataReceivedEventHandler e) 
    { 
     // ... 
    }; 

Assurez-vous d'appeler proc.BeginErrorReadLine() et proc.BeginOutputReadLine() après le démarrage du processus.

+0

toute solution finale avec un exemple de code source complet à ce sujet? – Kiquenet

1

Votre code fonctionne pour moi (testé avec TortoiseHg 2.0.2), à condition que je passe le chemin complet vers l'exécutable:

proc.StartInfo.FileName = "C:\\Program Files (x86)\\TortoiseHg\\hg.exe";