Process.StandardOutput Propriété

Définition

Obtient un flux utilisé pour lire la sortie textuelle de l'application.

public:
 property System::IO::StreamReader ^ StandardOutput { System::IO::StreamReader ^ get(); };
public System.IO.StreamReader StandardOutput { get; }
[System.ComponentModel.Browsable(false)]
public System.IO.StreamReader StandardOutput { get; }
member this.StandardOutput : System.IO.StreamReader
[<System.ComponentModel.Browsable(false)>]
member this.StandardOutput : System.IO.StreamReader
Public ReadOnly Property StandardOutput As StreamReader

Valeur de propriété

StreamReader qui peut être utilisé pour lire le flux de sortie standard de l'application.

Attributs

Exceptions

Le flux StandardOutput n’a pas été défini pour la redirection ; vérifiez que les propriétés RedirectStandardOutput et UseShellExecute ont respectivement pour valeur true et false.

- ou -

Le flux StandardOutput a été ouvert pour des opérations de lecture asynchrones avec BeginOutputReadLine().

Exemples

L’exemple suivant exécute la commande ipconfig.exe et redirige sa sortie standard vers la fenêtre de console de l’exemple.

using namespace System;
using namespace System::IO;
using namespace System::Diagnostics;

int main()
{
    Process^ process = gcnew Process();
    process->StartInfo->FileName = "ipconfig.exe";
    process->StartInfo->UseShellExecute = false;
    process->StartInfo->RedirectStandardOutput = true;
    process->Start();

    // Synchronously read the standard output of the spawned process-> 
    StreamReader^ reader = process->StandardOutput;
    String^ output = reader->ReadToEnd();

    // Write the redirected output to this application's window.
    Console::WriteLine(output);

    process->WaitForExit();
    process->Close();

    Console::WriteLine("\n\nPress any key to exit");
    Console::ReadLine();
    return 0;
}
using System;
using System.IO;
using System.Diagnostics;

class StandardOutputExample
{
    public static void Main()
    {
        using (Process process = new Process())
        {
            process.StartInfo.FileName = "ipconfig.exe";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.Start();

            // Synchronously read the standard output of the spawned process.
            StreamReader reader = process.StandardOutput;
            string output = reader.ReadToEnd();

            // Write the redirected output to this application's window.
            Console.WriteLine(output);

            process.WaitForExit();
        }

        Console.WriteLine("\n\nPress any key to exit.");
        Console.ReadLine();
    }
}
Imports System.IO
Imports System.Diagnostics

Module Module1
    Sub Main()
        Using process As New Process()
            process.StartInfo.FileName = "ipconfig.exe"
            process.StartInfo.UseShellExecute = False
            process.StartInfo.RedirectStandardOutput = True
            process.Start()

            ' Synchronously read the standard output of the spawned process. 
            Dim reader As StreamReader = process.StandardOutput
            Dim output As String = reader.ReadToEnd()
            Console.WriteLine(output)

            process.WaitForExit()
        End Using

        Console.WriteLine(Environment.NewLine + Environment.NewLine + "Press any key to exit.")
        Console.ReadLine()
    End Sub
End Module

Remarques

Lorsqu’un Process texte est écrit dans son flux standard, ce texte s’affiche normalement sur la console. En redirigeant le StandardOutput flux, vous pouvez manipuler ou supprimer la sortie d’un processus. Par exemple, vous pouvez filtrer le texte, le mettre en forme différemment ou écrire la sortie dans la console et dans un fichier journal désigné.

Notes

Pour utiliser StandardOutput, vous devez définir ProcessStartInfo.UseShellExecute sur false, et vous devez définir sur trueProcessStartInfo.RedirectStandardOutput . Sinon, la lecture à partir du StandardOutput flux lève une exception.

Le flux redirigé StandardOutput peut être lu de manière synchrone ou asynchrone. Des méthodes telles que Read, ReadLineet ReadToEnd effectuent des opérations de lecture synchrone sur le flux de sortie du processus. Ces opérations de lecture synchrone ne se terminent pas tant que les écritures associées Process dans son StandardOutput flux ne sont pas terminées ou que le flux ne ferme pas.

En revanche, démarre les BeginOutputReadLine opérations de lecture asynchrones sur le StandardOutput flux. Cette méthode active un gestionnaire d’événements désigné pour la sortie du flux et retourne immédiatement à l’appelant, qui peut effectuer d’autres tâches pendant que la sortie du flux est dirigée vers le gestionnaire d’événements.

Les opérations de lecture synchrone introduisent une dépendance entre la lecture de l’appelant à partir du StandardOutput flux et l’écriture du processus enfant dans ce flux. Ces dépendances peuvent entraîner des conditions d’interblocage. Lorsque l’appelant lit à partir du flux redirigé d’un processus enfant, il dépend de l’enfant. L’appelant attend l’opération de lecture jusqu’à ce que l’enfant écrive dans le flux ou ferme le flux. Lorsque le processus enfant écrit suffisamment de données pour remplir son flux redirigé, il dépend du parent. Le processus enfant attend lors de l’opération d’écriture suivante jusqu’à ce que le parent lise à partir du flux complet ou ferme le flux. La condition d’interblocage se produit lorsque l’appelant et le processus enfant attendent l’un sur l’autre pour terminer une opération, et ni l’un ni l’autre ne peut continuer. Vous pouvez éviter les interblocages en évaluant les dépendances entre l’appelant et le processus enfant.

Les deux derniers exemples de cette section utilisent la Start méthode pour lancer un exécutable nommé Write500Lines.exe. L’exemple suivant contient son code source.

using System;
using System.IO;

public class Example3
{
   public static void Main()
   {
      for (int ctr = 0; ctr < 500; ctr++)
         Console.WriteLine($"Line {ctr + 1} of 500 written: {ctr + 1/500.0:P2}");

      Console.Error.WriteLine("\nSuccessfully wrote 500 lines.\n");
   }
}
// The example displays the following output:
//      The last 50 characters in the output stream are:
//      ' 49,800.20%
//      Line 500 of 500 written: 49,900.20%
//'
//
//      Error stream: Successfully wrote 500 lines.
Imports System.IO

Public Module Example
   Public Sub Main()
      For ctr As Integer = 0 To 499
         Console.WriteLine($"Line {ctr + 1} of 500 written: {ctr + 1/500.0:P2}")
      Next

      Console.Error.WriteLine($"{vbCrLf}Successfully wrote 500 lines.{vbCrLf}")
   End Sub
End Module
' The example displays the following output:
'      The last 50 characters in the output stream are:
'      ' 49,800.20%
'      Line 500 of 500 written: 49,900.20%
'
'
'      Error stream: Successfully wrote 500 lines.

L’exemple suivant montre comment lire à partir d’un flux redirigé et attendre que le processus enfant se termine. L’exemple évite une condition d’interblocage en appelant p.StandardOutput.ReadToEnd avant p.WaitForExit. Une condition d’interblocage peut se produire si le processus parent appelle p.WaitForExit avant p.StandardOutput.ReadToEnd et si le processus enfant écrit suffisamment de texte pour remplir le flux redirigé. Le processus parent attendrait indéfiniment que le processus enfant se termine. Le processus enfant attendrait indéfiniment que le parent lise à partir du flux complet StandardOutput .

using System;
using System.Diagnostics;

public class Example2
{
   public static void Main()
   {
      var p = new Process();  
      p.StartInfo.UseShellExecute = false;  
      p.StartInfo.RedirectStandardOutput = true;  
      p.StartInfo.FileName = "Write500Lines.exe";  
      p.Start();  

      // To avoid deadlocks, always read the output stream first and then wait.  
      string output = p.StandardOutput.ReadToEnd();  
      p.WaitForExit();

      Console.WriteLine($"The last 50 characters in the output stream are:\n'{output.Substring(output.Length - 50)}'");
   }
}
// The example displays the following output:
//      Successfully wrote 500 lines.
//
//      The last 50 characters in the output stream are:
//      ' 49,800.20%
//      Line 500 of 500 written: 49,900.20%
//      '
Imports System.Diagnostics'

Public Module Example
   Public Sub Main()
      Dim p As New Process()
      p.StartInfo.UseShellExecute = False  
      p.StartInfo.RedirectStandardOutput = True  
      p.StartInfo.FileName = "Write500Lines.exe"  
      p.Start() 

      ' To avoid deadlocks, always read the output stream first and then wait.  
      Dim output As String = p.StandardOutput.ReadToEnd()  
      p.WaitForExit()

      Console.WriteLine($"The last 50 characters in the output stream are:\n'{output.Substring(output.Length - 50)}'")
   End Sub
End Module
' The example displays the following output:
'      Successfully wrote 500 lines.
'
'      The last 50 characters in the output stream are:
'      ' 49,800.20%
'      Line 500 of 500 written: 49,900.20%
'      '

Il existe un problème similaire lorsque vous lisez tout le texte à partir des flux d’erreur standard et de sortie standard. L’exemple suivant effectue une opération de lecture sur les deux flux. Il évite la condition d’interblocage en effectuant des opérations de lecture asynchrones sur le StandardError flux. Une condition d’interblocage se produit si le processus parent appelle p.StandardOutput.ReadToEnd suivi de p.StandardError.ReadToEnd et si le processus enfant écrit suffisamment de texte pour remplir son flux d’erreurs. Le processus parent attendrait indéfiniment que le processus enfant ferme son StandardOutput flux. Le processus enfant attendrait indéfiniment que le parent lise à partir du flux complet StandardError .

using System;
using System.Diagnostics;

public class Example
{
   public static void Main()
   {
      var p = new Process();  
      p.StartInfo.UseShellExecute = false;  
      p.StartInfo.RedirectStandardOutput = true;  
      string eOut = null;
      p.StartInfo.RedirectStandardError = true;
      p.ErrorDataReceived += new DataReceivedEventHandler((sender, e) => 
                                 { eOut += e.Data; });
      p.StartInfo.FileName = "Write500Lines.exe";  
      p.Start();  

      // To avoid deadlocks, use an asynchronous read operation on at least one of the streams.  
      p.BeginErrorReadLine();
      string output = p.StandardOutput.ReadToEnd();  
      p.WaitForExit();

      Console.WriteLine($"The last 50 characters in the output stream are:\n'{output.Substring(output.Length - 50)}'");
      Console.WriteLine($"\nError stream: {eOut}");
   }
}
// The example displays the following output:
//      The last 50 characters in the output stream are:
//      ' 49,800.20%
//      Line 500 of 500 written: 49,900.20%
//      '
//
//      Error stream: Successfully wrote 500 lines.
Imports System.Diagnostics

Public Module Example
   Public Sub Main()
      Dim p As New Process()  
      p.StartInfo.UseShellExecute = False  
      p.StartInfo.RedirectStandardOutput = True  
      Dim eOut As String = Nothing
      p.StartInfo.RedirectStandardError = True
      AddHandler p.ErrorDataReceived, Sub(sender, e) eOut += e.Data 
      p.StartInfo.FileName = "Write500Lines.exe"  
      p.Start()  

      ' To avoid deadlocks, use an asynchronous read operation on at least one of the streams.  
      p.BeginErrorReadLine()
      Dim output As String = p.StandardOutput.ReadToEnd()  
      p.WaitForExit()

      Console.WriteLine($"The last 50 characters in the output stream are:{vbCrLf}'{output.Substring(output.Length - 50)}'")
      Console.WriteLine($"{vbCrLf}Error stream: {eOut}")
   End Sub
End Module
' The example displays the following output:
'      The last 50 characters in the output stream are:
'      ' 49,800.20%
'      Line 500 of 500 written: 49,900.20%
'      '
'
'      Error stream: Successfully wrote 500 lines.

Vous pouvez utiliser des opérations de lecture asynchrones pour éviter ces dépendances et leur potentiel d’interblocage. Vous pouvez également éviter la condition d’interblocage en créant deux threads et en lisant la sortie de chaque flux sur un thread distinct.

Notes

Vous ne pouvez pas mélanger des opérations de lecture asynchrones et synchrones sur un flux redirigé. Une fois que le flux redirigé d’un Process est ouvert en mode asynchrone ou synchrone, toutes les opérations de lecture supplémentaires sur ce flux doivent être en mode identique. Par exemple, ne suivez BeginOutputReadLine pas avec un appel à ReadLine sur le StandardOutput flux, ou inversement. Toutefois, vous pouvez lire deux flux différents dans des modes différents. Par exemple, vous pouvez appeler BeginOutputReadLine , puis appeler ReadLine pour le StandardError flux.

S’applique à

Voir aussi