如何使用 PowerShell 找出过去 24 小时内失败的作业?

如何使用 PowerShell 找出过去 24 小时内失败的作业?

担任 DBA 多年,但对 PowerShell 还不熟悉。我希望使用 PowerShell 循环遍历多个 SQL Server 实例,并找出过去 24 小时内失败的作业。即使作业随后成功运行,我也需要知道失败情况。现在我只想让它在一台服务器上运行,然后我会转到多台服务器上。

到目前为止,我所拥有的功能可以循环遍历所有作业,但我不确定如何获取过去 24 小时的执行状态:

$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" "localhost"

$jobs = $srv.JobServer.Jobs

foreach ($job in $jobs)
{
    $jobHistory = $job.EnumHistory()
}

任何帮助都将不胜感激。我期待更多地了解 PowerShell,但现在,一些 SMO 有点令人困惑。

谢谢,丹

答案1

以下代码未经测试,但我认为它应该可以工作。

$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
    }
}

编辑:在玩了 Shawn 的代码后,我稍微改变了一下。我更喜欢他访问 RunDate 的方法。

答案2

如果您使用的是 SQL Server 2008 或更高版本以及 SQLPS,则只需使用以下代码行(为便于阅读已拆分):\

编辑:已更正代码,以使用 EnumHistory,就像 @pk 一样,但在 SQLPS 中。所以这实际上只是一种替代方法。


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 R2 SQLPS。Microsoft 将其制成可再发行的软件包。Chad Miller 写了一篇很好的文章博客文章并提供模块的下载。

相关内容