2018年2月6日火曜日

Windowsタスクスケジューラの実行結果監視スクリプト

タスクスケジューラの実行結果をPowershellで監視しているので、メモ代わりに残す。

◆PSファイルの中身
# ローカルマシン上有効なタスクを取得し、指定ファイルに書き込む
  $OutPut = "C:\BatFolder\TaskResultchecker\tasklist.csv"
  $OutPut2 = "C:\BatFolder\TaskResultchecker\temp.txt"
Function gettasks()
{
  "HOST,TASKNAME,RUNTIME,RESULT" | Out-File $output -encoding default

  $Tasks = schtasks.exe /query /V /FO CSV | ConvertFrom-Csv | Where { $_."ユーザーとして実行" -Like "(特定アカウントでの実行されるタスクをフィルタ)" }
  ForEach ($Task in $Tasks) {
    If ($Task."実行するタスク" -match "TaskResultchecker"){
        #自分のタスクは除く
        continue
  }
   $HostName = $Task."ホスト名"
   $BeforeRunTime = $Task."前回の実行時刻"
   $TaskName = $Task."タスク名".SubString(1)
   $BeforeResult = $Task."前回の結果"
   "$HostName,$TaskName,$BeforeRunTime,$BeforeResult" | Out-File $OutPut -append -encoding default
  }
}

# -----------------------------
# 実行結果、戻り値1以上の場合メール送信
# -----------------------------

  $now = Get-Date -F F
 
  #システムよりデータ抽出処理
  gettasks
 
  $task1 = ""
  $task1 = Get-Content $OutPut | ConvertFrom-CSV | where {$_.RESULT -gt 0}

  if($task1 -ne $null){
$task2 = Get-Content $OutPut | ConvertFrom-CSV | where {$_.RESULT -gt 0} > $OutPut2
# メール送信処理開始
$subject = "タスク実行異常"
$body = "確認時刻 --" + $now
$body = $body + [String]::Join("`r`n",(Get-Content $OutPut2))

# メール情報。宛先は;で複数指定可能
$smtp = "(smtpサーバIPアドレス Or ホスト名)" #SMTPサーバ(必須項目)
$from = "(送信元アドレス)" #送信元(必須項目)

# New-Opjectコマンドレットで.NETクラスをインスタンス化。
$mail = New-Object Net.Mail.MailMessage
$mail.From = $from
$mail.ReplyTo = $replyTo
$mail.Subject = $subject
$mail.Body = $body

# エンコーディング。System.Text.Encodingの静的メンバにアクセスするため::を用いている。
$mail.SubjectEncoding = [Text.Encoding]::GetEncoding("csISO2022JP")
$mail.BodyEncoding = [Text.Encoding]::GetEncoding("csISO2022JP")

# To設定。複数設定可能。
#$mail.To.Add("宛先")
$mail.To.Add("宛先メールアドレス")

#CC設定(必要があれば)
# $mail.CC.Add("CC")
# ReplyTo設定。設定なしも可。
#if($replyTo -ne ""){ $mail.ReplyTo = $replyTo }

# 添付ファイル
$temp = New-Object Net.Mail.Attachment($OutPut)
      $mail.Attachments.Add($temp);

# New-Opjectコマンドレットで.NETクラスをインスタンス化。
$sc = New-Object Net.Mail.SmtpClient($smtp)
# 送信。
$sc.Send($mail)
$mail.Dispose() 
Remove-Item $OutPut2
  }
  #if($task1 -eq $null)
  # {
  # exit
  # }
  #else
  # {

 # }

◆PSファイルをキックするためのBATファイル
powershell.exe -executionPolicy RemoteSigned -F C:\BatFolder\TaskResultchecker\schmoniter.ps1

0 件のコメント:

コメントを投稿