代码之家  ›  专栏  ›  技术社区  ›  Simon

PowerShell启动作业未运行脚本块

  •  0
  • Simon  · 技术社区  · 5 年前

    我已经挣扎了几天了,现在正在用-Scriptblock运行Start Job。

    $sb = {Get-Date}
    Start-Job -ScriptBlock $sb
    

    现在,我有一个脚本,它通过65+API调用对8种不同的状态进行报告。总的来说,它需要500多个API调用,并且需要20分钟才能完成(每个API调用需要2-5秒,x500),所以我希望并行运行每个foreach块。

    脚本作为脚本工作得很好,但不能作为开始作业。

    当我运行作业时,它会立即“完成”,并且有更多的数据是False(因此我看不到任何错误消息):

    67     Job67           BackgroundJob   Completed     False           localhost            foreach ($item....
    

    我的示例代码如下所示:

    $sb = {# Get count of Status1
                foreach ($item in $Global:GetItems) {
                    $item1 = $item.id
            
                    If ($null -eq $TokenExpiresIn) { .\Get-Token.ps1 }
                    $Global:TokenExpiresIn = New-TimeSpan -Start $TokenExpiresNow -End $Script:TokenExpiresTime
            
                    $Method = "GET"
                    $Fromitems = $item1
                    $Status = "foo"
                    $Limit = "1"
                    $Fields = "blah"
                        
                    $URL = "https://$APIServer/apis/v1.1/status?customerId=1&itemId=$Fromitems&status=$Status&fields=$Fields&limit=$Limit"
                    $Header = @{"Accept" = "*/*"; "Authorization" = "Bearer $SessionToken" }
            
                    $itemStatsResponse = Invoke-WebRequest -Method $Method -Uri $URL -Header $Header
                    $itemStatsJSON = ConvertFrom-Json -InputObject $itemStatsResponse 
                    $itemCount = $itemStatsJSON.metadata.count
            
                    $Global:GetItems | Where-Object -Property id -EQ $item1 | Add-Member -MemberType NoteProperty "foo" -Value $itemCount
                }
    }
    

    我按如下方式运行脚本块:

    Start-Job -Name "foo" -ScriptBlock $sb
    

    我正在使用PowerShell 7.1。脚本作为一个整体成功地运行了所有500多个API调用,但是它有点慢,所以我也在研究如何“多线程”我的API调用以获得更好的性能。

    提前感谢您的支持/投入。StackOverflow上与PowerShell和Scriptblocks相关的其他帖子到目前为止还没有帮助我。

    0 回复  |  直到 5 年前
    推荐文章