2010-12-01 4 views
0

Salut, pourquoi ai-je une erreur d'accès refusé lorsque j'essaie d'exécuter ce processus? Je courais commande (MSBuild "projectfile ici" "args supplémentaires") avec ce nouveau processusrediriger stdout vers une question de fichier?

public bool CmdExecute(string command,string args) 
    { 



      bool isOk = true; 
     try 
     { 
      using (System.Diagnostics.Process proc = new System.Diagnostics.Process()) 
      { 

       proc.EnableRaisingEvents = false; 
       proc.StartInfo.UseShellExecute = false; 
       proc.StartInfo.RedirectStandardOutput = true; 
       proc.StartInfo.FileName = command; 
       proc.StartInfo.Arguments = args; 

       // Console.Out.WriteLine(proc.StartInfo.Arguments); 

       proc.Start(); 
       string output = proc.StandardOutput.ReadToEnd(); 
       proc.WaitForExit(); 
       Console.WriteLine(output); 
      } 

      } 
     } 
     catch(Exception e) 
     { 
      Console.WriteLine(e.Message); 
      isOk = false; 
     } 
     return isOk; 
    } 

Répondre

1

Lire la documentation sur Process.StartInfo.RedirectStandardOutput. Vous ne l'utilisez pas correctement.

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx

Si vous utilisez RedirectStandardOutput, vous devriez lire Process.StandardOutput et Process.StandardError et faire quelque chose avec elle.

Je suppose que vous obtenez un accès refusé car la ligne de commande qui en résulte n'a pas de sens. Vous obtiendrez:

msbuild args &> P:\\build.txt 

L'esperluette étrangère (&) va causer des problèmes.

+0

Salut James merci pour la réponse. J'ai modifié mon code et toujours obtenir l'accès refusé erreur (voir ci-dessus), il va toujours à la capture. J'ai remarqué que lorsque proc.StartInfo.UseShellExecute est vrai je ne reçois pas l'erreur d'accès refusé, mais les redirectionstandardouput a besoin d'être faux. S'il vous plaît Aidez-moi, j'ai besoin de la sortie de msbuild à écrire dans un fichier – 3ggerhappy

+1

UseShellExecute vous permet de spécifier votre commande comme "Foo.docx" et ShellExecute recherchera le programme enregistré pour le lancement des fichiers docx. Donc vous n'avez pas besoin de cette option. Je vérifierais votre répertoire de travail (qui devrait probablement être défini à l'emplacement du fichier de construction) car votre script de construction pourrait essayer d'écrire sur un chemin auquel vous n'avez pas accès en écriture. Vous pouvez également utiliser ProcMon (http://technet.microsoft.com/fr-fr/sysinternals/bb896645.aspx) pour savoir dans quel fichier votre accès de réception a été refusé s'il ne se trouve pas dans votre trace de pile. –

+0

Salut Okay J'ai résolu le problème de l'accès refusé, et je peux maintenant obtenir une sortie standard en le redirigeant et en utilisant un streamwriter pour écrire dans un fichier. Mais j'ai une question de suivi pour une solution alternative. Est-il possible de rediriger la sortie standard de l'utilisation des opérateurs de redirection tels que ">" ou ">>" avec les arguments. Parce que je ne peux pas le faire fonctionner. La commande sera exécutée mais le fichier n'est pas créé. exemple la commande à exécuter serait: msbuild c: \ example.vbproj> build.log Lorsque je l'essaie manuellement dans la ligne de commande, il fonctionne parfaitement, il peut créer le fichier. Mais avec mon programme itwont? – 3ggerhappy

Questions connexes