7

我正在做一份看起来像这样的工作

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

我开始并接受我的工作是这样的:

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

现在我希望我$result只包含$data返回的内容。但是,在检查$result$data 之外,我会看到更多我不想包含在我的$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 的一个常见误解:脚本中所有未捕获的输出都返回给调用者,而不仅仅是“返回”的参数。例子:

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 语句用于提前退出函数,并可选择将一个或多个对象写入输出流(除了已经发出的其他输出)。

如果您不想获得输出,请使用以下语法之一:

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

您在输出中看到两个额外的“作业”对象的原因是两者都分别返回创建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尝试只是使用$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 回答
-1

我也遇到了同样的问题,我想排除评论。因此,最简单的解决方案是使用以下方法编写您的评论:

Write-Host("Your comments ") -Fore Red

于 2017-09-21T11:24:46.730 回答