長年のDBAですが、PowerShellは初めてです。 PowerShellを使用して複数のSQLServerインスタンスをループし、過去24時間以内に失敗したジョブを見つけたいと思っています。その後ジョブが正常に実行されたとしても、失敗を知る必要があります。今は1台のサーバーで動作させたいので、複数のサーバーに移動します。
これまでのところ、すべてのジョブをループすることができますが、過去24時間の実行ステータスを取得するために何をすべきかわかりません。
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" "localhost"
$jobs = $srv.JobServer.Jobs
foreach ($job in $jobs)
{
$jobHistory = $job.EnumHistory()
}
どんな助けでもいただければ幸いです。 PowerShellをもっと利用できることを楽しみにしていますが、現時点では、SMOの一部が少し混乱しています。
ありがとう、ダン
次のコードはテストされていませんが、動作するはずです。
$jobs = $srv.JobServer.Jobs
$jhf = New-Object Microsoft.SqlServer.Management.Smo.Agent.JobHistoryFilter
$jhf.OutcomeTypes = [Microsoft.SqlServer.Management.Smo.Agent.CompletionResult]::Failed
foreach ($job in $jobs)
{
foreach ($jobRun in $job.EnumHistory($jhf) | where {$_.RunDate -gt ((Get-Date).AddDays(-1))})
{
$jobRun
}
}
編集:ショーンのコードをいじった後、少し変更しました。 RunDateにアクセスする彼の方法の方が好きです。
SQLPSでSQLServer 2008以降を使用している場合は、次のコード行を使用できます(読みやすくするために分割されています):\
[〜#〜] edit [〜#〜]:@ pkと同じように、ただしSQLPS内でEnumHistoryを使用するようにコードを修正しました。だから本当にそれを行う別の方法。
dir SQLSERVER:\SQL\ServerName\DEFAULT\JobServer\Jobs | foreach {$_.EnumHistory()} |
where {$_.RunStatus -eq 0} | where {$_.RunDate -gt ((Get-Date).AddDays(-1))}
SQL 2005を実行している場合は、サーバーにSQL Server 2008 R2SQLPSをインストールできます。マイクロソフトはそれを再配布可能なパッケージにしました。 Chad Millerはそれに良い ブログ投稿 を書き、モジュールのダウンロードを提供します。