PowerShell, stream Process output and errors while running external process PowerShell, stream Process output and errors while running external process powershell powershell

PowerShell, stream Process output and errors while running external process


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 firingdo{    Write-Host 'Still alive!' -ForegroundColor Green    Start-Sleep -Seconds 1}while (!$Process.HasExited)# Unregister events$OutEvent.Name, $ErrEvent.Name |    ForEach-Object {Unregister-Event -SourceIdentifier $_}