从脚本块获取返回值

时间:2014-11-18 17:34:44

标签: powershell powershell-v3.0

我按照链接http://blogs.msdn.com/b/powershell/archive/2011/04/04/scaling-and-queuing-powershell-background-jobs.aspx中的示例创建了一个脚本。但是,我需要一个脚本块返回值$result的列表。如何修改脚本来完成它?

$maxConcurrentJobs = 3;

# Read the input and queue it up
$jobInput = get-content .\input.txt
$queue = [System.Collections.Queue]::Synchronized( (New-Object System.Collections.Queue) )
foreach($item in $jobInput)
{
    $queue.Enqueue($item)
}

# Function that pops input off the queue and starts a job with it
function RunJobFromQueue
{
    if( $queue.Count -gt 0)
    {
        $j = Start-Job -ScriptBlock {
           param($x); 
           #..... 
           $result ######### Need this value returned to the main script
           } -ArgumentList $queue.Dequeue()
        Register-ObjectEvent -InputObject $j -EventName StateChanged -Action { 
           RunJobFromQueue; 
           Unregister-Event $eventsubscriber.SourceIdentifier; 
           Remove-Job $eventsubscriber.SourceIdentifier 
           } | Out-Null
    }
}

# Start up to the max number of concurrent jobs
# Each job will take care of running the rest
for( $i = 0; $i -lt $maxConcurrentJobs; $i++ )
{
    RunJobFromQueue
}
######## Process a list of $result

2 个答案:

答案 0 :(得分:0)

将$ result序列化为文件。

当您进入'#处理$ result'的列表时 - 指向,查找文件并反序列化它们。

注意:您必须找到一种确定异步作业何时首先完成的好方法! (也许使用job-name = $结果文件名,如果$ result file name =一个不存在的工作名,可以安全打开)

答案 1 :(得分:0)

在删除已完成的作业之前添加Receive-Job $eventsubscriber.SourceIdentifier,并且不要将输出通过管道传输到Out-Null