web-dev-qa-db-ja.com

変数をCopy-DbaAgentJobの-jobに渡すにはどうすればよいですか?

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 
}
1
TuckRollworthy

リンクサーバークエリを使用してホイールを再発明する必要はありません。 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]' `

...すでに存在するためにスキップされたジョブが表示されます。

powershell session showing Copy-DbaAgentJob output

2
Peter Vandivier