2017-07-12 5 views
2

SqlPackage.exeのワーカープロセスを開始する方法はありますか?ターゲットデータベースはループバックできるように配列に格納されています。同じ)?PowerShellプロセスの処理 - PowerShellループで複数のSqlPackage.exeプロセスを開始する

エラーがなければ、これらのプロセスからのすべての印刷を抑制し、最後にレポートを表示したいと思います。どうすればいい?

今私は(スタートとして)次のようなループを持っている:

$arguments = @(
    "/Action:Import", 
    "/SourceFile:$($bacpacSource)", 
    "/TargetServerName:$($serverName)" 
) 

for ($i = 1; $i -lt 4; $i++) { 
    $targetDatabase = $baseDatabaseName + $i 
    $arguments += "/TargetDatabaseName:$($targetDatabase)" 
    Start-Process -FilePath $sqlPackagePath $arguments -NoNewWindow -PassThru 
} 

私はStart-Processどこかを発見し、私は、この関数によって返されたオブジェクトを格納し、何とかそれを使用する必要があることを確信しています。私はすべてのプロセスを開始し、すべてのプロセスが終了するのを待っています。その時点で、すべてのプロセスが成功したかどうかを調査します。エラーが発生した場合は、そのプロセスからエラー情報を出力します。現在、すべてのプロセスが同時に印刷され、バッファ全体がすべて終了した後に破損します。

これはPowerShellで可能ですか?

PS:このスクリプトは、.dacpacファイルを使用して更新版を本番環境に展開するためのものですが、この問題はWindowsプロセスとエラーの処理に厳密に関連しています。

EDIT:おそらく、一度に最大量のプロセスを作成して維持し、完了したときに交換する方法が必要になります。それで、いつでもサーバに接続するSqlPackage.exeプロセスが10個しかないとしましょう。 PowerShellでどうすればこのようなbarrier lockを作成することができますか?

+0

の仕事を見てください:http://wragg.io/tilfmol-4-powershell-jobs/ –

答えて

1

私はあなたがバックグラウンドジョブの各タスクをプッシュするために、次のようにPowerShellのジョブを組み込むし、それらがReceive-Jobを経由して、その出力を返す前に完了するのを待つWait-Jobを使用できると思います:

$arguments = @(
    "/Action:Import", 
    "/SourceFile:$($bacpacSource)", 
    "/TargetServerName:$($serverName)" 
) 

for ($i = 1; $i -lt 4; $i++) { 
    $targetDatabase = $baseDatabaseName + $i 
    $arguments += "/TargetDatabaseName:$($targetDatabase)" 
    Start-Job -ScriptBlock { Start-Process -FilePath $sqlPackagePath $arguments -NoNewWindow -PassThru } 
} 

Get-Job | Wait-Job | Receive-Job 
+0

これはあなたのコメントに従った後の私の今の種類です。特定のジョブがクラッシュしたかどうかをチェックしてExitCodeとErrorをチェックできるようにする方法を理解する必要があります。仕事でそれをすることはできますか?今すぐあなたはそれを仕事でラップしましたが、私は '$ sqlPackage $ arguments'を持っていた以前のバージョンに戻しました(そして私もScriptBlockにparam($ arguments)を再宣言しています)外部スコープにアクセスし、-ArgumentList(、$ arguments))を渡してください – Simon

+1

いくつかの実験の後、私は何らかの障壁アプローチ、または労働者のプールと(私が生成できる一連のタスクを持たなければならないと思いますそれと同じ方法で)。 – Simon

関連する問題