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ジョブはリモーティング プロトコルを使用するため、ローカルホストに対して効果的に「リモート」になります。同じコードが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 に答える