从另一个PowerShell会话监视PowerShell会话中的作业

Ser*_*uei 8 powershell powershell-2.0

脚本在循环中执行以下步骤,假设两个步骤都需要很长时间才能完成:

  1. $x = DoSomeWork;
  2. Start-Job -Name "Process $x" { DoSomeMoreWork $x; };

当然,第1步阻止脚本,第2步没有.我可以通过控制台轻松监控循环的进度/状态和步骤1.

我还想做的是在批处理仍在执行时监视由步骤2启动的作业的作业状态.

通常,可以从另一个会话"附加"或查询另一个PowerShell会话吗?(假设监视会话不会产生工作者会话)

x0n*_*x0n 6

如果我关注您,那么您就无法在两个不同的控制台实例之间共享状态。也就是说,按照你想要的方式去做是不可能的。但是,您不能从同一会话监视作业,这是不正确的。您可以使用作业内的事件发出信号:

Start-Job -Name "bgsignal" -ScriptBlock {

    # forward events named "progress" back to job owner
    # this even works across machines ;-)
    Register-EngineEvent -SourceIdentifier Progress -Forward

    $percent = 0
    while ($percent -lt 100) {
        $percent += 10

        # raise a new progress event, redirecting to $null to prevent
        # it ending up in the job's output stream
        New-Event -SourceIdentifier Progress -MessageData $percent > $null

        # wait 5 seconds
        sleep -Seconds 5
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以选择使用 或Wait-Event [-SourceIdentifier Progress]普通Register-EngineEvent -SourceIdentifier Progress [-Action { ... }]的旧式交互Get-Event来查看和/或操作同一会话(或者如果您在远程服务器上启动作业,则使用不同的计算机)的进度。

如果所有工作都在本地计算机上完成,您也完全有可能不需要作业基础设施。看一下我关于 RunspaceFactory 和 PowerShell 对象的旧博客文章,了解基本脚本“线程池”实现:

http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx

希望这可以帮助,

-奥辛

  • 谢谢。粘贴链接供后代使用。https://web.archive.org/web/20160308165355/http://www.nivot.org/post/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators (2认同)