2017-08-10 6 views
0

私はRest APIからJSONデータを取得するためのPowerShellスクリプトを作成しようとしています。このスクリプトは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

Matt、現在のジョブは実行に約12時間かかります。データをテーブルオブジェクトに追加してから各オブジェクトの統計をカウントするように変更した場合、それぞれの-parallelに対して〜を使用することができます。実行には約20分かかります。 1日に1回、ヒットする必要がある最初の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コールが並行して行われます。たくさんある場合は、同時に実行されているジョブの数を制御することができます。