我有一个其查询更改的网址。查询存储在一个数组中,因此在循环中更改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
}
}
答案 0 :(得分:2)
您将遇到上述代码的几个问题。脚本块被转移到另一个PowerShell.exe进程以执行,因此它不会访问$查询。你会像这样传递它:
...
$scriptblock = {param($queries)
...
}
...
$jobs += Start-Job $scriptblock -Arg $queries
另一个问题是你永远不会从$ job中删除已完成的工作,所以一旦这个$jobs.Count -lt 5
表达式因为计数达到5而变为假,你就永远不会再添加工作了。尝试这样的事情:
$jobs | Wait-Job -Any
$jobs = $jobs | Where ($_.State -eq 'Running'}
然后你最终只能使用$ jobs中正在运行的作业,这将允许你在之前的作业完成(或失败)时开始更多的工作。