【问题标题】:redirecting stdout to a file question?将标准输出重定向到文件问题?
【发布时间】:2010-12-01 22:26:00
【问题描述】:

您好,为什么我在尝试执行此过程时收到拒绝访问错误? 我正在使用这个新进程运行 (MSBuild "projectfile here" "additional args") 命令

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

【问题讨论】:

    标签: c# redirect stdout


    【解决方案1】:

    阅读有关 Process.StartInfo.RedirectStandardOutput 的文档。你没有正确使用它。

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

    如果您使用的是 RedirectStandardOutput,您应该阅读 Process.StandardOutput 和 Process.StandardError 并用它做一些事情。

    我怀疑您的访问被拒绝,因为您生成的命令行没有意义。你会得到:

    msbuild args &> P:\\build.txt
    

    多余的和号 (&) 会导致问题。

    【讨论】:

    • 嗨,詹姆斯,感谢您的回复。我已经修改了我的代码,但仍然收到拒绝访问错误(见上文),它总是会遇到问题。我注意到当 proc.StartInfo.UseShellExecute 为真时,我没有收到拒绝访问错误,但 redirectstandardouput 需要它为假。请帮助我,我需要将 msbuild 的输出写入文件
    • UseShellExecute 允许您将命令指定为“Foo.docx”,ShellExecute 将查找已注册的程序以启动 docx 文件。所以你不需要那个选项。我会验证您的工作目录(可能应该设置为构建文件的位置),因为您的构建脚本可能正在尝试写入您没有写入权限的路径。您还可以使用 ProcMon (technet.microsoft.com/en-us/sysinternals/bb896645.aspx) 找出您的接收访问被拒绝的文件,如果它不在您的堆栈跟踪中。
    • 您好,我已经解决了访问被拒绝的问题,现在可以通过重定向它并使用流写入器写入文件来获得标准输出。但我收到了一个关于替代解决方案的后续问题。是否可以使用重定向运算符(例如“>”或“>>”以及参数来重定向标准输出。因为我无法让它工作。该命令将被执行,但不会创建文件。例如,要执行的命令是: msbuild c:\example.vbproj > build.log 当我在命令行中手动尝试它时,它可以完美运行它可以创建文件。但是我的程序不会?
    • 问题是当您手动运行它时,您的命令外壳(cmd.exe 或 powershell.exe)正在解析命令行并执行重定向。当您使用 System.Diagnostics.Process 时,Process 对象正在启动命令并为其提供参数列表 - 包括您的命令重定向。不涉及 shell,因此无法执行重定向。如果您设置 UseShellExecute=true,它可能会起作用。我没试过。
    • 我也试图运行一个混乱的命令并遇到拒绝访问异常。我现在想拍我的额头,但是谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多