我正在经营一份看起来像这样的工作
$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
数组是不可能的。我该怎么办?
答案 0 :(得分:14)
你正在成为对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-job
和wait-job
分别返回创建和等待的作业对象。原因是允许流水线操作:
$results = start-job { ... } | wait-job | receive-job
这里发生了什么?好吧,start-job
创建一个作业并将其传递给wait-job
,等待作业完成,然后将作业传递给receive-job
,$results
返回结果并最终分配给{{1} }}
继?
答案 1 :(得分:1)
我也有同样的问题。我没有使用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
答案 2 :(得分:0)
我也面临同样的问题,我想要提出意见。 因此,最简单的解决方案是使用以下方式编写注释:
Write-Host("Your comments ") -Fore Red