2013-05-27 46 views
2

我有一个URL的查询发生更改。查询存储在一个数组中,所以更改URL并不是循环中的问题(我对任何特定查询都不感兴趣)。在PowerShell中使用多线程一次调用多个URL

我很难为每个URL创建作业并同时启动一组作业并监视它们。

我开始一次遍历查询数组5,我会调用5个新的URL,因此每个迭代需要有一个作业数组,其元素是该迭代的URL。

我的方法正确吗?任何指针将不胜感激!

这是示例代码来演示我的方法:

$queries = 1..10 
$jobs = @() 

foreach ($i in $queries) { 
    if ($jobs.Count -lt 5) { 
    $ScriptBlock = { 
     $query = $queries[$i] 
     $path = "http://mywebsite.com/$query" 
     Invoke-WebRequest -Uri $path 
    } 
    $jobs += Start-Job -ScriptBlock $ScriptBlock 
    } else { 
     $jobs | Wait-Job -Any 
    } 
} 
+1

请分享您的代码。 – Neolisk

回答

2

你会遇到的几个问题与上面的代码。该脚本块被转移到一个不同的PowerShell.exe进程来执行,因此它不会访问$查询。您将通过它,像这样:

... 
$scriptblock = {param($queries) 
    ... 
} 
... 
$jobs += Start-Job $scriptblock -Arg $queries 

另一个问题是,一旦这个$jobs.Count -lt 5表达evals为假,因为数已经达到5,你永远从$作业中删除完成的作业,你将永远不会添加再工作。尝试是这样的:

$jobs | Wait-Job -Any 
$jobs = $jobs | Where ($_.State -eq 'Running'} 

然后你会风,只有在$工作正在运行的作业,这将让你开始更多的就业机会为完成以前的工作(或失败)。

+0

我明白了。我尝试过但遇到错误。 '方法调用失败,因为[System.Management.Automation.PSRemotingJob]不包含名为'op_Addition''的方法。这是指'$ jobs + = ...'这行。它以前没有给我那个错误。我不确定为什么会发生这种情况(我最近开始使用PowerShell) –

+1

确保您总是重新初始化$ jobs,例如'$ jobs = @()'。另外,请确保在运行之间清除所有作业,例如'删除作业* - 强制'。 –