1つのソースインスタンスをクエリして、不足しているジョブをすべてコピーして宛先インスタンスにコピーしようとしています。名前を-jobに渡す以外はすべて機能しているようです。誰かが修正を提案したり、正しい方向に私を向けたりできますか?
$dest = "Dest\Instance"
$Source = "Source\Instance"
$MissingJob = Invoke-DbaQuery -SqlInstance $Source -ReadOnly -Query "
use msdb
select name
from dbo.sysjobs
where name COLLATE Latin1_General_CI_AS not in (select name
from [Dest\Instance].[msdb].[dbo].[sysjobs]
)"
foreach ($Name in $MissingJob){
Copy-DbaAgentJob -Source NCCSQLDEVW2K162\NCCSQL2017DBA01 -Destination $dest
-Job $Name -SourceSqlCredential $cred -Force
}
リンクサーバークエリを使用してホイールを再発明する必要はありません。 dbatoolsには、両方のエージェントのジョブを列挙するための Get-DbaAgentJob
関数も用意されています。また、$Job
パラメータは配列を入力として受け入れるため、forループは必要ありません。サンプルのようにジョブ名がキー属性であるとすると、次のようなことを試すことができます。
$sourceJobs = Get-DbaAgentJob -SqlInstance '[Source\Instance]'
$destJobs = Get-DbaAgentJob -SqlInstance '[Dest\Instance]'
$missingJobs = $sourceJobs | Where {
$_.Name -notin $destJobs.Name
}
Copy-DbaAgentJob `
-Source '[Source\Instance]' `
-Destination '[Dest\Instance]' `
-Job $missingJobs
厳密に言うと、Copy-DbaAgentJob
はすでに重複をチェックしているので、-Job
パラメータを完全に省略して、次のようなものを実行するだけで、さらに細かくすることができます...
Copy-DbaAgentJob `
-Source '[Source\Instance]' `
-Destination '[Dest\Instance]' `
...すでに存在するためにスキップされたジョブが表示されます。