如何更新PsRemotingJob的进度?

时间:2012-08-06 15:24:20

标签: powershell

使用start-job在powershell中启动作业时,将返回一个对象psremotingjob。 PsRemotingJob上的get-member给我们:

 TypeName: System.Management.Automation.PSRemotingJob

Name          MemberType     Definition                                       
----          ----------     ----------                                       
[...]
Progress      Property       System.Management.Automation.PSDataCollection`...
StatusMessage Property       System.String StatusMessage {get;}               
Verbose       Property       System.Management.Automation.PSDataCollection`...
Warning       Property       System.Management.Automation.PSDataCollection`...
State         ScriptProperty System.Object State {get=$this.JobStateInfo.St...

所以我想知道我是否可以从作业本身更新属性“进度”? 我构建了progressRecord集合,但我不知道如何从内部获取作业的属性。

$VMlist  = @("VM1","VM2")

foreach($VM in $VMlist)
{
    $j = start-job -name $VM -argumentlist @($path,$VM)  -ScriptBlock {
        $psdatacollectionExample = New-Object 'System.Management.Automation.PSDataCollection`1[System.Management.Automation.ProgressRecord]'
        $progressRecord = New-Object System.Management.Automation.ProgressRecord(1,"Task1","Installing")
        for($i=0;$i -lt 5; $i++)
        {
            $progressRecord.PercentComplete = $i * 20
            $psdatacollectionExample.Add($progressRecord)   
            #something like super.Progess = $psdatacollectionExample

        }
    }


}

1 个答案:

答案 0 :(得分:1)

您可以从服务器端作业脚本内部调用write-progress,就像本地脚本一样。然后,在客户端,您使用receive-job来检索进度记录,就像任何其他记录一样(警告,错误等)。如果将它们写入本地控制台输出流,它将为您呈现进度条。

所以:

for($i=0;$i -lt 5; $i++)
{
    $progressRecord.PercentComplete = $i * 20
    write-progress $progressRecord
}

就这么简单!

<强>更新

这是一个演示远程作业进度报告的简单示例。 Start-Job个作业使用远程协议,因此它们实际上是“远程”到localhost - 相同的代码与Invoke-Command一起使用。

PS> $job = start-job { 0..10 | % {
        write-progress -Id 1 -Activity "remote job" -Status "working..." `
          -PercentComplete ($_ * 10); sleep -seconds 2 } }
PS> receive-job $job -Wait 

上述脚本将以10%的增量显示进度条,直到作业完成。