gpt4 book ai didi

powershell - Register-EventObject 在监听进程时不更新控制台

转载 作者:行者123 更新时间:2023-12-02 07:45:17 27 4
gpt4 key购买 nike

我目前正在编写进程包装器,我正在尝试将 stdout 和 stderr channel 重定向到 powershell 控制台

以下代码是我用来调用进程的函数,但我似乎遇到的问题是我没有从事件处理程序获得任何输出来更新控制台

输出和错误输出在最后很好,但不会更新

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" }

}

最佳答案

取消代码中这些行的注释,它应该开始工作:

$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" }

}

关于powershell - Register-EventObject 在监听进程时不更新控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42100338/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com