PowerShell, stream Process output and errors while running external process

前端 未结 1 715
感情败类
感情败类 2020-12-30 12:11

I am using a PowerShell script to execute a console application and I am trying to redirect the standard output and the standard error from there. The code I am using is the

相关标签:
1条回答
  • 2020-12-30 13:17

    Is there any way in PowerShell I can stream the content of the Output and the Error while the process is running? In pure .NET we can subscribe to events of the Process class, can I do the same in PowerShell?

    Sure you can! What you need is an Object Events:

    An object event is a .Net object that not only has the usual Properties and Methods in the object, but also has another member called Event, which you can register a subscription on using Register-ObjectEvent

    Here is slightly modified example from the the PowerShell forums. It will output data from the ping command asynchronously (at least from the script point of view):

    # Setup stdin\stdout redirection
    $StartInfo = New-Object System.Diagnostics.ProcessStartInfo -Property @{
                    FileName = 'ping.exe'
                    Arguments = '-t 127.0.0.1'
                    UseShellExecute = $false
                    RedirectStandardOutput = $true
                    RedirectStandardError = $true
                }
    
    # Create new process
    $Process = New-Object System.Diagnostics.Process
    
    # Assign previously created StartInfo properties
    $Process.StartInfo = $StartInfo
    
    # Register Object Events for stdin\stdout reading
    $OutEvent = Register-ObjectEvent -Action {
        Write-Host $Event.SourceEventArgs.Data
    } -InputObject $Process -EventName OutputDataReceived
    
    $ErrEvent = Register-ObjectEvent -Action {
        Write-Host $Event.SourceEventArgs.Data
    } -InputObject $Process -EventName ErrorDataReceived
    
    # Start process
    [void]$Process.Start()
    
    # Begin reading stdin\stdout
    $Process.BeginOutputReadLine()
    $Process.BeginErrorReadLine()
    
    # Do something else while events are firing
    do
    {
        Write-Host 'Still alive!' -ForegroundColor Green
        Start-Sleep -Seconds 1
    }
    while (!$Process.HasExited)
    
    # Unregister events
    $OutEvent.Name, $ErrEvent.Name |
        ForEach-Object {Unregister-Event -SourceIdentifier $_}
    
    0 讨论(0)
提交回复
热议问题