2012-12-03 3 views
2

은 내가 시작하고 같은 직장을받는이반환 데이터

$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 배열에 포함하고 싶지 않은 훨씬 더 많은 정보를 볼 때.

(반환 된 데이터 :)

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 배열을 반복하는 것은 그렇게 할 수 없습니다. 내가 무엇을 할 수 있을지?

답변

11

당신은 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 

당신이 돈이 '(이미 방출 다른 출력에 추가.) t는 추적 구문 중 하나를 사용, 뭔가 출력을 얻으려면 :

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

다음은 당신의 출력에 두 개의 별도의 "작업"물체를보고있는 이유를 그 모두 start-job 및 생성 된 작업 개체를 반환 wait-job 기다렸다 존경심 ively. 그 이유는 파이프 라인을 허용하는 것입니다.

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

여기에 무슨 일이 일어나고있는 것입니까? 음, start-job은 작업을 생성하고 작업이 완료 될 때까지 대기하는 wait-job으로 전달한 다음 작업을 receive-job으로 전달하여 결과를 반환하고 결국 $results에 할당됩니다.

다음?

+0

+1 완벽한 설명! –

+0

글쎄, 이것은 계몽하고 문제를 해결했습니다! 고맙습니다! – masi

+1

@masi; 얼마나 정확히 해결 했니? –

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 
+0

거의 완벽하게! 대신 ** Returned-Data ** Code-Block에 게시 된 세부 정보에는 실제 $ 데이터 앞에 반환 된 두 개의 System.Management.Automation.PSRemotingJob 항목 (해당 객체의 유형)이 있습니다. 어떤 아이디어? – masi

+0

스크립트에서 반환 키워드를 반환하는 유일한 방법은 return 키워드가 아닙니다. 위의 내 대답을 참조하십시오. – x0n

0

나는 또한 내가 exclde 의견과 같은 문제에 직면했다. 그래서 가장 쉬운 솔루션을 사용하여 댓글을 작성하는 것입니다 :

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