Functions/PoShMon.SharePoint/Test-JobHealth.ps1
Function Test-JobHealth { [CmdletBinding()] param ( [System.Management.Automation.Runspaces.PSSession]$RemoteSession, [int]$MinutesToScanHistory = 1440 # one day ) $stopWatch = [System.Diagnostics.Stopwatch]::StartNew() Write-Verbose "Testing Failing Timer Jobs..." $sectionHeader = "Failing Timer Jobs" $NoIssuesFound = $true $outputHeaders = @{ 'JobDefinitionTitle' = 'Job Definition Title'; 'EndTime' = 'End Time'; 'ServerName' = 'Server Name'; 'WebApplicationName' = 'Web Application Name'; 'ErrorMessage' ='Error Message' } $outputValues = @() $startDate = (Get-Date).AddMinutes(-$MinutesToScanHistory) #.ToUniversalTime() $jobHistoryEntries = Invoke-Command -Session $RemoteSession -ScriptBlock { param($StartDate) $farm = Get-SPFarm $timerJobService = $farm.TimerService $jobHistoryEntries = $timerJobService.JobHistoryEntries | Where-Object { $_.Status -eq "Failed" -and $_.StartTime -gt $StartDate } return $jobHistoryEntries } -ArgumentList $startDate if ($jobHistoryEntries.Count -gt 0) { $NoIssuesFound = $false foreach ($jobHistoryEntry in $jobHistoryEntries) { Write-Verbose ($jobHistoryEntry.JobDefinitionTitle + " at " + $jobHistoryEntry.EndTime + " on " + $jobHistoryEntry.ServerName + " for " + $jobHistoryEntry.WebApplicationName + " : " + $jobHistoryEntry.ErrorMessage) $outputItem = @{ 'JobDefinitionTitle' = $jobHistoryEntry.JobDefinitionTitle; 'EndTime' = $jobHistoryEntry.EndTime; 'ServerName' = $jobHistoryEntry.ServerName; 'WebApplicationName' = $jobHistoryEntry.WebApplicationName; 'ErrorMessage' = $jobHistoryEntry.ErrorMessage } $outputValues += $outputItem } } $stopWatch.Stop() return @{ "SectionHeader" = $sectionHeader; "NoIssuesFound" = $NoIssuesFound; "OutputHeaders" = $outputHeaders; "OutputValues" = $outputValues; "ElapsedTime" = $stopWatch.Elapsed; } } <# $output = Test-JobHealth -RemoteSession $remoteSession -MinutesToScanHistory 2000 -Verbose Persist-Output $output Get-EmailOutput $output #> |