2017-02-07 16 views
4

Я нахожусь в настоящее время в процессе написания процесса обертки и я пытаюсь перенаправить стандартный вывод и STDERR каналы на Powershell консольРегистр-EventObject не обновляет консоль во время прослушивания для обработки

следующий кодом является функция, которую я использую для вызова моего процесса, но проблема, с которой я, похоже, сталкиваюсь, заключается в том, что я не получаю никакого вывода от обработчиков событий, чтобы обновить консоль

вывод и вывод ошибки в конце, но не будут обновляться как это происходит

function Invoke-Executable($ExePath, $ExeArgs) 
{ 
     #Setup ProcessInfo 
     $pinfo = New-Object System.Diagnostics.ProcessStartInfo 
     $pinfo.FileName = $ExePath 
     $pinfo.RedirectStandardError = $true 
     $pinfo.RedirectStandardOutput = $true 
     $pinfo.UseShellExecute = $false 
     $pinfo.Arguments = $ExeArgs 

     #Setup Process 
     $process = New-Object System.Diagnostics.Process 
     $process.StartInfo = $pinfo 


     #Setup Error Listener 
     $errEvent = Register-ObjectEvent -InputObj $process ` 
     -Event "ErrorDataReceived" ` 
     -Action ` 
     { 
      param 
      (
       [System.Object] $sender, 
       [System.Diagnostics.DataReceivedEventArgs] $e 
      ) 
      Write-Error $e.Data 
     } 

     #Setup Out Listener 
     $outEvent = Register-ObjectEvent -InputObj $process ` 
     -Event "OutputDataReceived" ` 
     -Action ` 
     { 
      param 
      (
       [System.Object] $sender, 
       [System.Diagnostics.DataReceivedEventArgs] $e 
      ) 
      Write-Host $e.Data 
     } 

     # Start the process 
     [Void] $process.Start() 
     # Begin async read events 
     # $process.BeginOutputReadLine() 
     # $process.BeginErrorReadLine() 

     while (!$process.HasExited) 
     { 
      Start-Sleep -Milliseconds 250 
      Write-Host "ping" 
     } 
     $stdout = $process.StandardOutput.ReadToEnd() 
     $stderr = $process.StandardError.ReadToEnd() 
     # if ($stdout) {Write-Host "$stdout"} 

     # if ($stderr) { Write-Error "$stderr" } 

} 

ответ

1

раскомментируйте эти строки в своем коде, и он должен начать работать:

$process.BeginOutputReadLine() 
$process.BeginErrorReadLine() 

Я изменил Write-Error в Write-Host по тем же причинам, что обсуждается здесь: Write-Error does not print to console before script exits

Пример используется для вывода REDIR тестирования:

Invoke-Executable ping "127.0.0.1" 

Пример, используемый для проверки ошибки redir:

Invoke-Executable powershell 'import-module nonexistant -ea continue;exit' 

Полный код:

function Invoke-Executable($ExePath, $ExeArgs) 
{ 
     #Setup ProcessInfo 
     $pinfo = New-Object System.Diagnostics.ProcessStartInfo 
     $pinfo.FileName = $ExePath 
     $pinfo.RedirectStandardError = $true 
     $pinfo.RedirectStandardOutput = $true 
     $pinfo.UseShellExecute = $false 
     $pinfo.Arguments = $ExeArgs 

     #Setup Process 
     $process = New-Object System.Diagnostics.Process 
     $process.StartInfo = $pinfo 


     #Setup Error Listener 
     $errEvent = Register-ObjectEvent -InputObj $process ` 
     -Event "ErrorDataReceived" ` 
     -Action ` 
     { 
      param 
      (
       [System.Object] $sender, 
       [System.Diagnostics.DataReceivedEventArgs] $e 
      ) 
      Write-host $e.Data 
     } 

     #Setup Out Listener 
     $outEvent = Register-ObjectEvent -InputObj $process ` 
     -Event "OutputDataReceived" ` 
     -Action ` 
     { 
      param 
      (
       [System.Object] $sender, 
       [System.Diagnostics.DataReceivedEventArgs] $e 
      ) 
      Write-Host $e.Data 
     } 

     # Start the process 
     [Void] $process.Start() 
     # Begin async read events 
     $process.BeginOutputReadLine() 
     $process.BeginErrorReadLine() 

     while (!$process.HasExited) 
     { 
      Start-Sleep -Milliseconds 250 
      Write-Host "ping" 

     } 

     # if ($stdout) {Write-Host "$stdout"} 

     # if ($stderr) { Write-Error "$stderr" } 

}