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