PowerShell 中作业有新数据时异步触发函数

问题描述 投票:0回答:1

我希望控制台在作业有新数据时(从以

Start-ThreadJob
开始的作业)触发功能,即每当
.HasMoreData
为 True 时。我希望 Register-ObjectEvent 能在这方面帮助我,但不幸的是,似乎没有 HasMoreData 的事件。不过,有 is 导致作业状态发生变化的事件。

一种解决方案可能是让作业的脚本块在需要更多数据时更改作业的状态,尽管我不确定最好的方法。

最好的解决方案可能是重写 ThreadJob 类的某些部分,为其提供一个与可以注册的 HasMoreData 相关的事件,但这目前超出了我的能力。

powershell asynchronous events jobs
1个回答
0
投票

您的问题不清楚您到底想在添加数据时做什么,但作为示例,如果您使用 之一异步调用它们,您可以直接使用

powershell
实例,而不是使用 ThreadJobs
 BeginInvoke<TInput, TOutput>
重载,您可以挂钩
PSDataCollection<T>
并注册到其
DataAdded
事件
:

try {
    $ps = [powershell]::Create().AddScript({
        $timer = [System.Diagnostics.Stopwatch]::StartNew()
        while ($timer.Elapsed.Seconds -lt 30) {
            Get-Random
            Start-Sleep 1
        }
    }, $true)

    $output = [System.Management.Automation.PSDataCollection[psobject]]::new()
    $iasync = $ps.BeginInvoke(
        [System.Management.Automation.PSDataCollection[psobject]]::new(),
        $output)

    $registerObjectEventSplat = @{
        InputObject      = $output
        EventName        = 'DataAdded'
        SourceIdentifier = 'Testing'
        Action           = {
            foreach ($item in $sender.ReadAll()) {
                "$([datetime]::Now.ToString('s')) - An item was added: '$item'" |
                    Out-Host
            }
        }
    }

    $null = Register-ObjectEvent @registerObjectEventSplat
    Wait-Event -SourceIdentifier Testing
}
finally {
    Unregister-Event Testing
    $ps.Stop()
    $ps.EndInvoke($iasync)
    $ps.Dispose()
    $output.Dispose()
}
© www.soinside.com 2019 - 2024. All rights reserved.