7

私はこのような仕事をしています

$myjob =
{
  # regerate some $data
  return $data
}

私は次のように仕事を始めて受け取ります:

Start-Job -ScriptBlock $myjob -Name "job1"
Wait-Job -Name "job1"
$result = Receive-Job -Job "job1"

今、私は返されたもの$resultだけを含めたいと思っています。$dataただし、 $data 以外を調べると、配列$resultに含めたくない情報がさらに多く表示されます。$dataめちゃくちゃなデータは次のように始まります。

(返されたデータ: )

State         : Running
HasMoreData   : True
StatusMessage : 
Location      : localhost
Command       :  # regerate some $data
                 return $data
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : f7c63b33-d270-4fa8-8042-111edf9d86a6
Id            : 270
Name          : job1
ChildJobs     : {Job271}
PSBeginTime   : 03.12.2012 14:06:26
PSEndTime     : 
PSJobTypeName : BackgroundJob
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}

これを20回くらい繰り返します。その後、私の本物$dataがリストされます。ただし、$result配列を反復処理することはできません。私に何ができる?

4

3 に答える 3

17

あなたは、powershell に関する一般的な誤解の餌食になっています: スクリプト内のキャプチャされていない出力はすべて、"return" の引数だけでなく、呼び出し元に返されます。例:

ps> $s = {
    1..3 # write 1,2,3 to output stream
    return 4 # write 4 to output stream, then exit scriptblock!
    5 # won't be output
    return 6 # won't be output either
}

ps> & $s
1
2
3
4

return ステートメントは、関数を早期に終了し、オプションで 1 つまたは複数のオブジェクトを出力ストリームに書き込むために使用されます (既に発行された他の出力に加えて)。

何かを出力したくない場合は、次の構文のいずれかを使用します。

$null = mycommand 
mycommand > $null
[void] (mycommand)

出力に 2 つの余分な「ジョブ」オブジェクトが表示される理由は、 と の両方が、それぞれ作成および待機されたジョブ オブジェクトstart-jobwait-job返すためです。この理由は、パイプラインを許可するためです。

$results = start-job { ... } | wait-job | receive-job 

ここで何が起こっているのですか?さて、start-jobジョブを作成し、それを にwait-job渡します。ジョブはジョブが完了するまで待機します。その後、ジョブを に渡します。ジョブreceive-jobは結果を返し、最終的に に割り当てられ$resultsます。

続く?

于 2012-12-03T14:30:45.773 に答える
0

私も同じ問題を抱えていました。returnキーワードを使用しないことで、それを回避しました。リモートジョブの最後のステートメントとしてreturn $data使用して、tryで終了する代わりに:$data

$myjob =
{
  # regerate some $data
  $data
}

なぜこれが機能しているように見えるのかわかりません。

私もこのようにリモートジョブを呼び出しています:

$job = Invoke-Command -ComputerName $servers -FilePath $myRemoteScript -ArgumentList $myArgs -AsJob -JobName $jobName | Get-Job | Wait-Job
$data = Receive-Job -Job $job
于 2012-12-03T13:59:42.490 に答える