2017-08-10 80 views
0

我想創建一個PowerShell腳本來從Rest API中檢索JSON數據。該腳本將作爲SQL Server代理作業運行,並將收集到的所有內容插入數據庫中。PowerShell並行API數據檢索

我已經探索了Foreach循環的並行選項,將它添加到工作流中,但在嘗試將數據寫入數據表時遭到阻塞,因爲它似乎被視爲與簡單對象不同。

這是可以做的工作嗎?還有另一種方式可以並行運行嗎?整個事情需要重組嗎?理想情況下,這隻會在本地PowerShell代碼中運行,而無需安裝任何其他模塊。今天

我的代碼的基本結構是:

#Compose URL 

#Create a New-Object system.Data.DataTable and configure it 

#Make Invoke-RestMethod API call to get the collection of objects 

Foreach($object in $Collection){ 
#Make API call for details about each object 
#Add data to datatable 
} 

#Write datatable to database 
+0

爲什麼你需要對此進行並行處理? – Matt

+0

馬特,目前的工作大概需要12小時才能運行。如果我將它從添加數據更改爲表格對象來計算每個對象的統計數據,我可以在其中使用每個對象的平均數據,則大約需要20分鐘才能運行。我需要打的第一個API,每天一次都很好,但是我還有其他來源,我希望使用相同的模式,可能需要更長的時間。 – Aaron

回答

0

你爲什麼不使用的作業本?

# define script block with api call 
$JobSb = { 
    param($obid) 

    # make api call 

    write-output = [PsCustomObject]@{ 
    Obid = $obid 
    ApiResult = 0; 
    } 
} 

# start jobs for all objects 
Foreach ($object in $Collection) { 
    Start-Job -ScriptBlock $JobSB -ArgumentList $object.Id -Name $object.name 
} 

# wait for jobs to finish 
while (get-job) { 
    Get-Job | Where-Object State -NE 'Running' | ForEach-Object { 
     if ($_.State -ne 'Completed') { 
      Write-Warning ('Job [{0}] [{1}] ended with state [{2}].' -f $_.id,$_.Name,$_.State) 
     } else { 
      $JobResults = @(Receive-Job $_) 
     } 

     # write results to datatable 

     remove-job $_ 
    } 
    start-sleep -Seconds 1 
} 

Api調用將並行進行。如果其中有很多,您可能想同時控制正在運行的作業數量。