3

在 powershell 中使用 start-job 启动作业时,会返回一个对象 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

        }
    }


}
4

1 回答 1

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% 的增量显示进度条,直到作业完成。

于 2012-08-06T18:51:56.540 回答