Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Powershell-foreach到阵列作为作业(本地/多线程)_Arrays_Multithreading_Powershell_Jobs - Fatal编程技术网

Arrays Powershell-foreach到阵列作为作业(本地/多线程)

Arrays Powershell-foreach到阵列作为作业(本地/多线程),arrays,multithreading,powershell,jobs,Arrays,Multithreading,Powershell,Jobs,我正试图解析一个网站来收集价格和产品细节。脚本以循环方式工作,但速度非常慢。因此,我尝试将多线程powershell脚本作为作业运行 我尝试了很多建议,但我很难得到结果,即使我可以看到它的工作(网络请求屏幕闪烁) 我只选择了最后10个,但我会在稍后设置油门。只是无法将其输出。基本上,我希望所有结果都返回到$arr中 因此,您需要使用运行空间。运行空间是一个相当复杂的事情,幸运的是我们有一个豪华的RSJob,为您处理一切 您可以传入脚本块,因此只需要很少的调整。 可能是这样的: foreach

我正试图解析一个网站来收集价格和产品细节。脚本以循环方式工作,但速度非常慢。因此,我尝试将多线程powershell脚本作为作业运行

我尝试了很多建议,但我很难得到结果,即使我可以看到它的工作(网络请求屏幕闪烁)

我只选择了最后10个,但我会在稍后设置油门。只是无法将其输出。基本上,我希望所有结果都返回到$arr中



因此,您需要使用运行空间。运行空间是一个相当复杂的事情,幸运的是我们有一个豪华的RSJob,为您处理一切

您可以传入脚本块,因此只需要很少的调整。 可能是这样的:

foreach ($product in $ImportedProducts){
    Start-RSJob -ScriptBlock $ScriptBlock
}
Get-RSjob | Receive-RSJob

如果要将结果放入$arr中,则无法从脚本块中执行此操作。不能允许并行运行的多个脚本块访问变量的单个副本,而不采取不值得进入的其他步骤

问题的答案是将每个脚本块的输出作为常规输出写入。该输出将被缓冲,直到使用Receive Job从作业中获取结果,然后以单线程方式将其捕获到$arr变量中。下面是鳕鱼,它应该能让你一路到达那里

#Import Danmurphy Sitelist
[xml] $XmlDocument = (New-Object System.Net.WebClient).DownloadString("http://www.example.com/sites.xml")

#get websites listed
$ImportedProducts = $XmlDocument.DocumentElement.url | select -Last 10

"Killing existing jobs . . ."
Get-Job | Remove-Job -Force
"Done."

#loop through the products

#Create Array
$arr = @()

#$argumentlist 

#ScriptBlock
$ScriptBlock = {
    Param($product)

    if ($product.loc -like "http://www.example.com/product/*"){

    $uri = $product.loc
    $WebResponse = Invoke-WebRequest -Uri $uri -SessionVariable WS 


    #mainpricetest
    $mainprice = $WebResponse.AllElements | ? { $_.Class -eq 'price-main' } | select innerText

    $MainPriceArray = $mainprice.innerText.Split(' ')

    $MainUnitArry = $MainPriceArray[1..10]

    $MainDollar = $MainPriceArray[0]

    $MainUnit = $MainUnitArry -join ' '


    $item = New-Object PSObject
    $item | Add-Member -type NoteProperty -Name 'Product Site' -Value $($product.loc)
    $item | Add-Member -type NoteProperty -Name 'Main Price' -Value $($MainDollar)
    $item | Add-Member -type NoteProperty -Name 'Main Unit' -Value $($MainUnit)



    Write-Output $item

    }
}

foreach ($product in $ImportedProducts){
    Start-Job -InputObject $ImportedProducts -ScriptBlock $ScriptBlock -ArgumentList $product
}

do {
    $arr += Get-Job -State Completed | Receive-Job -AutoRemoveJob
} while (Get-Job -State Running)

#Show Array
$arr

为什么不从脚本块中删除
$arr+=$item
,并用
$data
捕获输出?我很擅长标记这项工作,但似乎无法获得输出。拥有更多的数据总是错误的。我尝试按照Bill Hurt的建议添加write output$项<代码>启动RSJob-InputObject$ImportedProducts-ScriptBlock$ScriptBlock-ArgumentList$product-Throttle和
do{$arr+=Get-RSJob-State Completed | Receive-RSJob}同时(Get-RSJob-State Running)
。看起来RSJob只能在管道中使用。谢谢你,这很有效:
$ImportedProducts | foreach{Start RSJob-ScriptBlock$ScriptBlock-ArgumentList${uu-Throttle 10}do{$arr+=Get RSJob-State Completed | Receive RSJob Get RSJob-State Completed | Remove RSJob}while(Get RSJob-State Running)
#Import Danmurphy Sitelist
[xml] $XmlDocument = (New-Object System.Net.WebClient).DownloadString("http://www.example.com/sites.xml")

#get websites listed
$ImportedProducts = $XmlDocument.DocumentElement.url | select -Last 10

"Killing existing jobs . . ."
Get-Job | Remove-Job -Force
"Done."

#loop through the products

#Create Array
$arr = @()

#$argumentlist 

#ScriptBlock
$ScriptBlock = {
    Param($product)

    if ($product.loc -like "http://www.example.com/product/*"){

    $uri = $product.loc
    $WebResponse = Invoke-WebRequest -Uri $uri -SessionVariable WS 


    #mainpricetest
    $mainprice = $WebResponse.AllElements | ? { $_.Class -eq 'price-main' } | select innerText

    $MainPriceArray = $mainprice.innerText.Split(' ')

    $MainUnitArry = $MainPriceArray[1..10]

    $MainDollar = $MainPriceArray[0]

    $MainUnit = $MainUnitArry -join ' '


    $item = New-Object PSObject
    $item | Add-Member -type NoteProperty -Name 'Product Site' -Value $($product.loc)
    $item | Add-Member -type NoteProperty -Name 'Main Price' -Value $($MainDollar)
    $item | Add-Member -type NoteProperty -Name 'Main Unit' -Value $($MainUnit)



    Write-Output $item

    }
}

foreach ($product in $ImportedProducts){
    Start-Job -InputObject $ImportedProducts -ScriptBlock $ScriptBlock -ArgumentList $product
}

do {
    $arr += Get-Job -State Completed | Receive-Job -AutoRemoveJob
} while (Get-Job -State Running)

#Show Array
$arr