Process.BeginErrorReadLine 方法

定义

在应用程序的重定向 StandardError 流上开始进行异步读取操作。

public:
 void BeginErrorReadLine();
public void BeginErrorReadLine ();
[System.Runtime.InteropServices.ComVisible(false)]
public void BeginErrorReadLine ();
member this.BeginErrorReadLine : unit -> unit
[<System.Runtime.InteropServices.ComVisible(false)>]
member this.BeginErrorReadLine : unit -> unit
Public Sub BeginErrorReadLine ()
属性

例外

RedirectStandardError 属性为 false

StandardError 流上已在进行异步读取操作。

同步读取操作已使用 StandardError 流。

示例

以下示例使用 net view 命令列出远程计算机上的可用网络资源。 用户提供目标计算机名称作为命令行参数。 用户还可以为错误输出提供文件名。 该示例收集 net 命令的输出,等待进程完成,然后将输出结果写入控制台。 如果用户提供可选的错误文件,则示例会将错误写入文件。

// Define the namespaces used by this sample.
#using <System.dll>

using namespace System;
using namespace System::Text;
using namespace System::Globalization;
using namespace System::IO;
using namespace System::Diagnostics;
using namespace System::Threading;
using namespace System::ComponentModel;

ref class ProcessNetStreamRedirection
{
private:
   // Define static variables shared by class methods.
   static StreamWriter^ streamError = nullptr;
   static String^ netErrorFile = "";
   static StringBuilder^ netOutput = nullptr;
   static bool errorRedirect = false;
   static bool errorsWritten = false;

public:
   static void RedirectNetCommandStreams()
   {
      String^ netArguments;
      Process^ netProcess;
      
      // Get the input computer name.
      Console::WriteLine( "Enter the computer name for the net view command:" );
      netArguments = Console::ReadLine()->ToUpper( CultureInfo::InvariantCulture );
      if ( String::IsNullOrEmpty( netArguments ) )
      {
         // Default to the help command if there is not an input argument.
         netArguments = "/?";
      }
      
      // Check if errors should be redirected to a file.
      errorsWritten = false;
      Console::WriteLine( "Enter a fully qualified path to an error log file" );
      Console::WriteLine( "  or just press Enter to write errors to console:" );
      netErrorFile = Console::ReadLine()->ToUpper( CultureInfo::InvariantCulture );
      if (  !String::IsNullOrEmpty( netErrorFile ) )
      {
         errorRedirect = true;
      }
      
      // Note that at this point, netArguments and netErrorFile
      // are set with user input.  If the user did not specify
      // an error file, then errorRedirect is set to false.

      // Initialize the process and its StartInfo properties.
      netProcess = gcnew Process;
      netProcess->StartInfo->FileName = "Net.exe";
      
      // Build the net command argument list.
      netProcess->StartInfo->Arguments = String::Format( "view {0}", netArguments );
      
      // Set UseShellExecute to false for redirection.
      netProcess->StartInfo->UseShellExecute = false;
      
      // Redirect the standard output of the net command.  
      // This stream is read asynchronously using an event handler.
      netProcess->StartInfo->RedirectStandardOutput = true;
      netProcess->OutputDataReceived += gcnew DataReceivedEventHandler( NetOutputDataHandler );
      netOutput = gcnew StringBuilder;
      if ( errorRedirect )
      {
         
         // Redirect the error output of the net command. 
         netProcess->StartInfo->RedirectStandardError = true;
         netProcess->ErrorDataReceived += gcnew DataReceivedEventHandler( NetErrorDataHandler );
      }
      else
      {
         
         // Do not redirect the error output.
         netProcess->StartInfo->RedirectStandardError = false;
      }

      Console::WriteLine( "\nStarting process: net {0}",
         netProcess->StartInfo->Arguments );
      if ( errorRedirect )
      {
         Console::WriteLine( "Errors will be written to the file {0}", netErrorFile );
      }
      
      // Start the process.
      netProcess->Start();
      
      // Start the asynchronous read of the standard output stream.
      netProcess->BeginOutputReadLine();

      if ( errorRedirect )
      {
         // Start the asynchronous read of the standard
         // error stream.
         netProcess->BeginErrorReadLine();
      }
      
      // Let the net command run, collecting the output.
      netProcess->WaitForExit();

      if ( streamError != nullptr )
      {
         // Close the error file.
         streamError->Close();
      }
      else
      {
         // Set errorsWritten to false if the stream is not
         // open.   Either there are no errors, or the error
         // file could not be opened.
         errorsWritten = false;
      }

      if ( netOutput->Length > 0 )
      {
         // If the process wrote more than just
         // white space, write the output to the console.
         Console::WriteLine( "\nPublic network shares from net view:\n{0}\n",
            netOutput->ToString() );
      }

      if ( errorsWritten )
      {
         // Signal that the error file had something 
         // written to it.
         array<String^>^errorOutput = File::ReadAllLines( netErrorFile );
         if ( errorOutput->Length > 0 )
         {
            Console::WriteLine( "\nThe following error output was appended to {0}.",
               netErrorFile );
            System::Collections::IEnumerator^ myEnum = errorOutput->GetEnumerator();
            while ( myEnum->MoveNext() )
            {
               String^ errLine = safe_cast<String^>(myEnum->Current);
               Console::WriteLine( "  {0}", errLine );
            }
         }
         Console::WriteLine();
      }

      netProcess->Close();

   }

private:
   static void NetOutputDataHandler( Object^ /*sendingProcess*/,
      DataReceivedEventArgs^ outLine )
   {
      // Collect the net view command output.
      if (  !String::IsNullOrEmpty( outLine->Data ) )
      {
         // Add the text to the collected output.
         netOutput->AppendFormat(  "\n  {0}", outLine->Data );
      }
   }

   static void NetErrorDataHandler( Object^ /*sendingProcess*/,
      DataReceivedEventArgs^ errLine )
   {
      // Write the error text to the file if there is something to 
      // write and an error file has been specified.

      if (  !String::IsNullOrEmpty( errLine->Data ) )
      {
         if (  !errorsWritten )
         {
            if ( streamError == nullptr )
            {
               // Open the file.
               try
               {
                  streamError = gcnew StreamWriter( netErrorFile,true );
               }
               catch ( Exception^ e ) 
               {
                  Console::WriteLine(  "Could not open error file!" );
                  Console::WriteLine( e->Message->ToString() );
               }
            }

            if ( streamError != nullptr )
            {
               // Write a header to the file if this is the first
               // call to the error output handler.
               streamError->WriteLine();
               streamError->WriteLine( DateTime::Now.ToString() );
               streamError->WriteLine(  "Net View error output:" );
            }
            errorsWritten = true;
         }

         if ( streamError != nullptr )
         {
            // Write redirected errors to the file.
            streamError->WriteLine( errLine->Data );
            streamError->Flush();
         }
      }
   }
};
// Define the namespaces used by this sample.
using System;
using System.Text;
using System.Globalization;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.ComponentModel;

namespace ProcessAsyncStreamSamples
{

    class ProcessNetStreamRedirection
    {
        // Define static variables shared by class methods.
        private static StreamWriter streamError =null;
        private static String netErrorFile = "";
        private static StringBuilder netOutput = null;
        private static bool errorRedirect = false;
        private static bool errorsWritten = false;

        public static void RedirectNetCommandStreams()
        {
            String netArguments;
            Process netProcess;

            // Get the input computer name.
            Console.WriteLine("Enter the computer name for the net view command:");
            netArguments = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture);
            if (String.IsNullOrEmpty(netArguments))
            {
                // Default to the help command if there is not an input argument.
                netArguments = "/?";
            }

            // Check if errors should be redirected to a file.
            errorsWritten = false;
            Console.WriteLine("Enter a fully qualified path to an error log file");
            Console.WriteLine("  or just press Enter to write errors to console:");
            netErrorFile = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture);
            if (!String.IsNullOrEmpty(netErrorFile))
            {
                errorRedirect = true;
            }

            // Note that at this point, netArguments and netErrorFile
            // are set with user input.  If the user did not specify
            // an error file, then errorRedirect is set to false.

            // Initialize the process and its StartInfo properties.
            netProcess = new Process();
            netProcess.StartInfo.FileName = "Net.exe";

            // Build the net command argument list.
            netProcess.StartInfo.Arguments = String.Format("view {0}",
                netArguments);

            // Set UseShellExecute to false for redirection.
            netProcess.StartInfo.UseShellExecute = false;

            // Redirect the standard output of the net command.
            // This stream is read asynchronously using an event handler.
            netProcess.StartInfo.RedirectStandardOutput = true;
            netProcess.OutputDataReceived += new DataReceivedEventHandler(NetOutputDataHandler);
            netOutput = new StringBuilder();

            if (errorRedirect)
            {
                // Redirect the error output of the net command.
                netProcess.StartInfo.RedirectStandardError = true;
                netProcess.ErrorDataReceived += new DataReceivedEventHandler(NetErrorDataHandler);
            }
            else
            {
                // Do not redirect the error output.
                netProcess.StartInfo.RedirectStandardError = false;
            }

            Console.WriteLine("\nStarting process: net {0}",
                netProcess.StartInfo.Arguments);
            if (errorRedirect)
            {
                Console.WriteLine("Errors will be written to the file {0}",
                    netErrorFile);
            }

            // Start the process.
            netProcess.Start();

            // Start the asynchronous read of the standard output stream.
            netProcess.BeginOutputReadLine();

            if (errorRedirect)
            {
                // Start the asynchronous read of the standard
                // error stream.
                netProcess.BeginErrorReadLine();
            }

            // Let the net command run, collecting the output.
            netProcess.WaitForExit();

            if (streamError != null)
            {
                // Close the error file.
                streamError.Close();
            }
            else
            {
                // Set errorsWritten to false if the stream is not
                // open.   Either there are no errors, or the error
                // file could not be opened.
                errorsWritten = false;
            }

            if (netOutput.Length > 0)
            {
                // If the process wrote more than just
                // white space, write the output to the console.
                Console.WriteLine("\nPublic network shares from net view:\n{0}\n",
                    netOutput);
            }

            if (errorsWritten)
            {
                // Signal that the error file had something
                // written to it.
                String [] errorOutput = File.ReadAllLines(netErrorFile);
                if (errorOutput.Length > 0)
                {
                    Console.WriteLine("\nThe following error output was appended to {0}.",
                        netErrorFile);
                    foreach (String errLine in errorOutput)
                    {
                        Console.WriteLine("  {0}", errLine);
                    }
                }
                Console.WriteLine();
            }

            netProcess.Close();
        }

        private static void NetOutputDataHandler(object sendingProcess,
            DataReceivedEventArgs outLine)
        {
            // Collect the net view command output.
            if (!String.IsNullOrEmpty(outLine.Data))
            {
                // Add the text to the collected output.
                netOutput.Append(Environment.NewLine + "  " + outLine.Data);
            }
        }

        private static void NetErrorDataHandler(object sendingProcess,
            DataReceivedEventArgs errLine)
        {
            // Write the error text to the file if there is something
            // to write and an error file has been specified.

            if (!String.IsNullOrEmpty(errLine.Data))
            {
                if (!errorsWritten)
                {
                    if (streamError == null)
                    {
                        // Open the file.
                        try
                        {
                            streamError = new StreamWriter(netErrorFile, true);
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("Could not open error file!");
                            Console.WriteLine(e.Message.ToString());
                        }
                    }

                    if (streamError != null)
                    {
                        // Write a header to the file if this is the first
                        // call to the error output handler.
                        streamError.WriteLine();
                        streamError.WriteLine(DateTime.Now.ToString());
                        streamError.WriteLine("Net View error output:");
                    }
                    errorsWritten = true;
                }

                if (streamError != null)
                {
                    // Write redirected errors to the file.
                    streamError.WriteLine(errLine.Data);
                    streamError.Flush();
                }
            }
        }
    }
}
' Define the namespaces used by this sample.
Imports System.Text
Imports System.Globalization
Imports System.IO
Imports System.Diagnostics
Imports System.Threading
Imports System.ComponentModel

Namespace ProcessAsyncStreamSamples
   
   Class ProcessAsyncErrorRedirection
      ' Define static variables shared by class methods.
      Private Shared streamError As StreamWriter = Nothing
      Private Shared netErrorFile As String = ""
      Private Shared netOutput As StringBuilder = Nothing
      Private Shared errorRedirect As Boolean = False
      Private Shared errorsWritten As Boolean = False
      
      Public Shared Sub RedirectNetCommandStreams()
         Dim netArguments As String
         Dim netProcess As Process
         
         ' Get the input computer name.
         Console.WriteLine("Enter the computer name for the net view command:")
         netArguments = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture)
         If String.IsNullOrEmpty(netArguments) Then
            ' Default to the help command if there is 
            ' not an input argument.
            netArguments = "/?"
         End If
         
         ' Check if errors should be redirected to a file.
         errorsWritten = False
         Console.WriteLine("Enter a fully qualified path to an error log file")
         Console.WriteLine("  or just press Enter to write errors to console:")
         netErrorFile = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture)
         If Not String.IsNullOrEmpty(netErrorFile) Then
            errorRedirect = True
         End If
         
         ' Note that at this point, netArguments and netErrorFile
         ' are set with user input.  If the user did not specify
         ' an error file, then errorRedirect is set to false.

         ' Initialize the process and its StartInfo properties.
         netProcess = New Process()
         netProcess.StartInfo.FileName = "Net.exe"
         
         ' Build the net command argument list.
         netProcess.StartInfo.Arguments = String.Format("view {0}", _
                                                        netArguments)
         
         ' Set UseShellExecute to false for redirection.
         netProcess.StartInfo.UseShellExecute = False
         
         ' Redirect the standard output of the net command.  
         ' Read the stream asynchronously using an event handler.
         netProcess.StartInfo.RedirectStandardOutput = True
         AddHandler netProcess.OutputDataReceived, _
                            AddressOf NetOutputDataHandler
         netOutput = new StringBuilder()
         
         If errorRedirect Then
            ' Redirect the error output of the net command. 
            netProcess.StartInfo.RedirectStandardError = True
            AddHandler netProcess.ErrorDataReceived, _
                            AddressOf NetErrorDataHandler
         Else
            ' Do not redirect the error output.
            netProcess.StartInfo.RedirectStandardError = False
         End If
         
         Console.WriteLine(ControlChars.Lf + "Starting process: NET {0}", _
                           netProcess.StartInfo.Arguments)
         If errorRedirect Then
            Console.WriteLine("Errors will be written to the file {0}", _
                           netErrorFile)
         End If
         
         ' Start the process.
         netProcess.Start()
         
         ' Start the asynchronous read of the standard output stream.
         netProcess.BeginOutputReadLine()
         
         If errorRedirect Then
            ' Start the asynchronous read of the standard
            ' error stream.
            netProcess.BeginErrorReadLine()
         End If
         
         ' Let the net command run, collecting the output.
         netProcess.WaitForExit()
      
         If Not streamError Is Nothing Then
             ' Close the error file.
             streamError.Close()
         Else 
             ' Set errorsWritten to false if the stream is not
             ' open.   Either there are no errors, or the error
             ' file could not be opened.
             errorsWritten = False
         End If
   
         If netOutput.Length > 0 Then
            ' If the process wrote more than just
            ' white space, write the output to the console.
            Console.WriteLine()
            Console.WriteLine("Public network shares from net view:")
            Console.WriteLine()
            Console.WriteLine(netOutput)
            Console.WriteLine()
         End If
         
         If errorsWritten Then
            ' Signal that the error file had something 
            ' written to it.
            Dim errorOutput As String()
            errorOutput = File.ReadAllLines(netErrorFile)
            If errorOutput.Length > 0 Then

                Console.WriteLine(ControlChars.Lf + _
                    "The following error output was appended to {0}.", _
                    netErrorFile)
                Dim errLine as String
                For Each errLine in errorOutput
                    Console.WriteLine("  {0}", errLine)
                Next
          
                Console.WriteLine()
            End If
         End If
         
         netProcess.Close()
      End Sub 
      
      
      Private Shared Sub NetOutputDataHandler(sendingProcess As Object, _
          outLine As DataReceivedEventArgs)

         ' Collect the net view command output.
         If Not String.IsNullOrEmpty(outLine.Data) Then
            ' Add the text to the collected output.
            netOutput.Append(Environment.NewLine + "  " + outLine.Data)
         End If
      End Sub 
       
      
      Private Shared Sub NetErrorDataHandler(sendingProcess As Object, _
          errLine As DataReceivedEventArgs)

         ' Write the error text to the file if there is something to
         ' write and an error file has been specified.

         If Not String.IsNullOrEmpty(errLine.Data) Then

            If Not errorsWritten Then
                If streamError Is Nothing Then
                    ' Open the file.
                    Try 
                        streamError = New StreamWriter(netErrorFile, true)
                    Catch e As Exception
                        Console.WriteLine("Could not open error file!")
                        Console.WriteLine(e.Message.ToString())
                    End Try
                End If

                If Not streamError Is Nothing Then

                    ' Write a header to the file if this is the first
                    ' call to the error output handler.
                    streamError.WriteLine()
                    streamError.WriteLine(DateTime.Now.ToString())
                    streamError.WriteLine("Net View error output:")

                End If

                errorsWritten = True
            End If
                     
            If Not streamError Is Nothing Then
                  
                ' Write redirected errors to the file.
                streamError.WriteLine(errLine.Data)
                streamError.Flush()
             End If
          End If
      End Sub 
   End Class  
End Namespace

注解

StandardError可以同步或异步读取流。 、 ReadLineReadToEndRead方法对进程的错误输出流执行同步读取操作。 在关联的 Process 写入到其 StandardError 流或关闭流之前,这些同步读取操作不会完成。

相反,对 BeginErrorReadLineStandardError 流启动异步读取操作。 此方法为流输出启用指定的事件处理程序,并立即返回给调用方,调用方可以在流输出定向到事件处理程序时执行其他工作。

按照以下步骤对 Process 执行异步读取操作StandardError

  1. UseShellExecute 设置为 false

  2. RedirectStandardError 设置为 true

  3. 将事件处理程序添加到 ErrorDataReceived 事件。 事件处理程序必须与委托签名匹配 System.Diagnostics.DataReceivedEventHandler

  4. 启动 Process

  5. 调用 BeginErrorReadLineProcess。 此调用在 上 StandardError启动异步读取操作。

当异步读取操作启动时,每当关联的 Process 将一行文本写入其 StandardError 流时,都会调用 事件处理程序。

可以通过调用 CancelErrorRead来取消异步读取操作。 调用方或事件处理程序可以取消读取操作。 取消后,可以再次调用 BeginErrorReadLine 以恢复异步读取操作。

注意

不能在重定向流上混合异步和同步读取操作。 在异步或同步模式下打开 的重定向流 Process 后,该流上的所有进一步读取操作都必须处于同一模式。 例如,不要在流中StandardError调用 BeginErrorReadLineReadLine反之亦然。 但是,可以在不同的模式下读取两个不同的流。 例如,可以调用 BeginErrorReadLine ,然后为StandardOutput流调用 ReadLine

适用于

另请参阅