Process.BeginErrorReadLine 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
在应用程序的重定向 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 ()
- 属性
例外
示例
以下示例使用 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可以同步或异步读取流。 、 ReadLine和 ReadToEnd 等Read方法对进程的错误输出流执行同步读取操作。 在关联的 Process 写入到其 StandardError 流或关闭流之前,这些同步读取操作不会完成。
相反,对 BeginErrorReadLineStandardError 流启动异步读取操作。 此方法为流输出启用指定的事件处理程序,并立即返回给调用方,调用方可以在流输出定向到事件处理程序时执行其他工作。
按照以下步骤对 Process 执行异步读取操作StandardError:
将 UseShellExecute 设置为
false
。将 RedirectStandardError 设置为
true
。将事件处理程序添加到 ErrorDataReceived 事件。 事件处理程序必须与委托签名匹配 System.Diagnostics.DataReceivedEventHandler 。
启动 Process。
调用 BeginErrorReadLine 的 Process。 此调用在 上 StandardError启动异步读取操作。
当异步读取操作启动时,每当关联的 Process 将一行文本写入其 StandardError 流时,都会调用 事件处理程序。
可以通过调用 CancelErrorRead来取消异步读取操作。 调用方或事件处理程序可以取消读取操作。 取消后,可以再次调用 BeginErrorReadLine 以恢复异步读取操作。
注意
不能在重定向流上混合异步和同步读取操作。 在异步或同步模式下打开 的重定向流 Process 后,该流上的所有进一步读取操作都必须处于同一模式。 例如,不要在流中StandardError调用 BeginErrorReadLine ,ReadLine反之亦然。 但是,可以在不同的模式下读取两个不同的流。 例如,可以调用 BeginErrorReadLine ,然后为StandardOutput流调用 ReadLine 。