web-dev-qa-db-ja.com

PowerShellを使用して、過去24時間以内に失敗したジョブを見つけるにはどうすればよいですか?

長年の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の一部が少し混乱しています。

ありがとう、ダン

4
SQL3D

次のコードはテストされていませんが、動作するはずです。

$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にアクセスする彼の方法の方が好きです。

2
pk.

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はそれに良い ブログ投稿 を書き、モジュールのダウンロードを提供します。

1
user47078