2010-12-01 3 views
0

Hallo, warum bekomme ich einen Zugriff verweigert Fehler, wenn ich versuche, diesen Prozess auszuführen? Ich betreiben (MSBuild „project hier“ „zusätzlicher args“) Befehl mit diesem neuen Prozessstdout auf eine Dateifrage umleiten?

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; 
    } 

Antwort

1

die Dokumentation auf Process.StartInfo.RedirectStandardOutput lesen. Du benutzt es nicht richtig.

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

Wenn Sie RedirectStandardOutput verwenden, sollten Sie Process.StandardOutput und Process.StandardError und etwas zu tun, damit sein zu lesen.

Ich vermute, dass Sie einen Zugriff verweigert erhalten, da die resultierende Befehlszeile keinen Sinn ergibt. Sie erhalten würden:

msbuild args &> P:\\build.txt 

Der Fremdampersand (&) Probleme verursachen wird.

+0

Hallo James danke für die Antwort. Ich habe meinen Code geändert und bekomme immer noch den access denied error (siehe oben), es geht immer an den catch. Ich habe bemerkt, dass, wenn proc.StartInfo.UseShellExecute wahr ist, ich nicht den Zugriff verweigert Fehler erhalten, aber redirectstandardoutput benötigt es falsch sein. Bitte helfen Sie mir Ich brauche die Ausgabe von Msbuild in eine Datei geschrieben werden – 3ggerhappy

+1

UseShellExecute können Sie Ihren Befehl als "Foo.docx" angeben und ShellExecute sucht das registrierte Programm zum Starten von DOCX-Dateien. Sie brauchen diese Option also nicht. Ich würde Ihr Arbeitsverzeichnis überprüfen (das wahrscheinlich auf den Speicherort der Builddatei festgelegt sein sollte), da Ihr Buildskript möglicherweise versucht, in einen Pfad zu schreiben, auf den Sie keinen Schreibzugriff haben. Sie könnten auch ProcMon (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) verwenden, um herauszufinden, auf welche Datei Ihr empfangender Zugriff verweigert wird, wenn er nicht in Ihrem Stack-Trace enthalten ist. –

+0

Hallo Okay Ich habe das Problem der Zugriffsverweigerung gelöst und kann jetzt Standard outby bekommen, indem ich es umadressiere und einen Streamwriter benutze, um in die Datei zu schreiben. Aber ich habe eine Follow-up-Frage für eine alternative Lösung. Ist es möglich, die Standardausgabe von Umleitungsoperatoren wie ">" oder ">>" zusammen mit den Argumenten umzuleiten. Weil ich es nicht zur Arbeit bringen kann. Der Befehl wird ausgeführt, aber die Datei wird nicht erstellt. Beispiel der auszuführende Befehl wäre: msbuild c: \ beispiel.vbproj> build.log Wenn ich es manuell in der Befehlszeile versuche funktioniert es perfekt es kann die Datei erstellen. Aber mit meinem Programm itwont? – 3ggerhappy