重定向Microsoft修补程序的standardoutput

时间:2011-04-23 16:21:55

标签: c#

我目前正在尝试编写一个通过vbscript处理MS修补程序的DLL。到目前为止,我已设法使核心功能正常工作并设法捕获返回代码但又想更进一步 - 我需要捕获进程的输出,因为返回代码并不总是正确的(即,如果是不需要修补程序,它仍然返回0的返回代码 - 不好)。

下面是我用来启动进程并将输出写入事件日志的一些代码的副本,但是它一直写一个空白值...任何想法我做错了什么?

   Process p = new Process();

            p.StartInfo.FileName = strExe;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.UseShellExecute = false;

            p.Start();
            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();

            WriteEvent(strAppName, "Error", 1000, output);

1 个答案:

答案 0 :(得分:2)

此修补程序可能是写入StandardError而不是StandardOutput。这是我在需要捕获两种输出时使用的方法:

        /// <summary>
    /// run a program using the provided ProcessStartInfo
    /// </summary>
    /// <param name="processInfo"></param>
    /// <returns>Both StandardError and StandardOutput</returns>
    public static string WithOutputRedirect(System.Diagnostics.ProcessStartInfo processInfo)
    {
        string result = "";

        processInfo.CreateNoWindow = true;
        processInfo.UseShellExecute = false;

        processInfo.RedirectStandardError = true;
        processInfo.RedirectStandardOutput = true;

        System.Diagnostics.Process p = System.Diagnostics.Process.Start(processInfo);

        p.ErrorDataReceived += delegate(object o, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (e.Data != null && e.Data != "")
            {
                result += e.Data + "\r\n";
            }
        };
        p.BeginErrorReadLine();

        p.OutputDataReceived += delegate(object o, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (e.Data != null && e.Data != "")
            {
                result += e.Data + "\r\n";
            }
        };
        p.BeginOutputReadLine();

        p.WaitForExit();

        return result;
    }