Quantcast
Channel: Windows PowerShell forum
Viewing all articles
Browse latest Browse all 21975

Get SQL Agent Job EnumHistory via Powershell

$
0
0

Hi guys!!

I  am using Powershell through DollarU (Workload automation software) to execute SQL Agent job (all steps) or one specific step at a time.  So far so good, everything is working!!  However, when it gets to the point where I want to get the History log information, I can't seem get what I want.

Here is my program:  

param ([parameter (Mandatory = $true)][string]$ServerName,

       [parameter (Mandatory = $true)][string]$JobName,

       [string]$StepName = "")



write-host "Starting SQL Agent Job $($JobName) on Server $($ServerName)"

$date=Get-Date

write-host "It is now: $($date)"

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null

$srv = New-Object Microsoft.SqlServer.Management.SMO.Server("$ServerName")

$job = $srv.jobserver.jobs["$JobName"]
$jobstart="No"

if (($job))
{

   if ($StepName -ne '')
      {
        $job.Start($StepName)
        $jobstart="Yes"
        Start-Sleep -s 5  # Pause for 5 seconds (optional) - was 30 seconds (v1); v2=5
      }

   else
      {
        $job.Start()
        $jobstart="Yes"
        Start-Sleep -s 5
      }
}

else
{
   $jobstart="Not found"
}

if ($jobstart -eq "Yes")
{
   write-host "Job $($JobName) on Server $($ServerName) started"
   $i=0

   do
   {
     $job.Refresh();
     $iRem = $i % 5;
     $jobrunning=$job.CurrentRunStatus.ToString();

     if ($iRem -eq 0)
     {
       $date=Get-Date
       write-host "Job $($JobName) Processing--Run Step:$($job.CurrentRunStep) Status:$($job.CurrentRunStatus.ToString())... at $($date)"
     }

     Start-Sleep -s 10; # Pause for 10 seconds  - was 60 seconds (v1); v2=10
     $i++;
   }

   while ($job.CurrentRunStatus.ToString() -ne "Idle")
     if ($job.LastRunOutcome -ne "Cancelled")
     {
       write-host "Job Processing done"
     }
     else
     {
       write-host "Job Processing cancelled/aborted"
     }

     #   $jobRunning="TRUE"
     write-host "$($srv.name) $($job.name)"
     write-host "Last job outcome $($job.LastRunOutcome)"
     write-host "Last job outcome $($job.LastRunDate)"

        if ($job.EnumHistory().Rows[0] -ne $null)
        {
           write-host "xxxx $($job.EnumHistory().Rows[0].Message)"
        }

        if ($job.EnumHistory().Rows[1] -ne $null)
        {
           write-host "yyyyy $($job.EnumHistory().Rows[1].Message)"
        }


        $LastRun=$job.LastRunOutcome

        if ($StepName -ne '')
        {
           $JobStep = $Job.JobSteps[$StepName]
           Write-Host "Name: $($JobStep.Name) RunDate: $($JobStep.LastRunDate) Status: $($JobStep.LastRunOutCome)"
        }

        else
        {
          $StepCount = $job.JobSteps.Count - 1

        for ($i=0;$i -le $StepCount;$i++)
        {
         $m = $job.JobSteps[$i].LastRunDate
         write-host "Name: $($job.JobSteps[$i].Name) RunDate: $($job.JobSteps[$i].LastRunDate) Status: $($job.JobSteps[$i].LastRunOutCome)"

         if ($job.LastRunDate -gt $m)
             {
                   $LastRun="FailedOrAborted"
             }
       }
     }


     if ($LastRun -eq "Failed")
     {
       write-host "Job returned with Failed status"
       exit 2
     }

     if ($LastRun -ne "FailedOrAborted")
     {
       if ($LastRun -ne "Cancelled")
           {
             exit 0
           }

       else
           {
             write-host "Job Cancelled xxxxx"
             exit 3
           }
        }

     else
     {
             write-host "Job Failed or Aborted"
             exit 2
      }
}

else
{
  write-host "Unable to Start Job $($JobName) on Server $($ServerName)"
  write-host "Reason: Job may not exist or not enabled."
  exit 1
}


When there are no specific step to execute...  when only the jobName is provided, I get the proper information.  When it is only a specific step, the second line (YYYY) returns information from past executions.

 if ($job.EnumHistory().Rows[0] -ne $null)
    {
       write-host "xxxx $($job.EnumHistory().Rows[0].Message)"
    }

    if ($job.EnumHistory().Rows[1] -ne $null)
    {
       write-host "yyyyy $($job.EnumHistory().Rows[1].Message)"
    }


In the following picture, you will see the lines of History log information that I got in return for run executed at 10:42 on August 15th (???)

What I would like to get are the following lines of information:

So I tried the following lines of code without any success...

if ($job.EnumJobStepLogs($StepName).Rows[0] -ne $null)
{
  write-host "xxxx $($job.EnumJobStepLogs($StepName).Rows[0].Message)"
}

if ($job.EnumJobStepLogs($StepName).Rows[1] -ne $null)
{
  write-host "yyyyy $($job.EnumJobStepLogs($StepName).Rows[1].Message)"
}

and this...

if ($job.EnumHistory($stepName).Rows[0] -ne $null)
{
   write-host "xxxx $($job.EnumHistory($stepName).Rows[0].Message)"
}

if ($job.EnumHistory($stepName).Rows[1] -ne $null)
{
   write-host "yyyyy $($job.EnumHistory($stepName).Rows[1].Message)"
}

I really don't understand...  and don't know what to try anymore :-(

Can you help me?

Mylene


Mylene Chalut


Viewing all articles
Browse latest Browse all 21975

Trending Articles