【入門編】【タスクスケジューラ実行結果レポート】Get-ScheduledTask 相当の処理を WMI と Shell 連携で作成するタスク監視 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場のシステム運用で「毎日のタスクが本当に正常終了しているか、一目でわかるレポートが欲しいなぁ」と悩んだことはありませんか?

PowerShellなら `Get-ScheduledTask` で一発ですが、「セキュリティポリシーでPowerShellの実行が制限されている」「古いWindows Server環境でサクッと動かしたい」という現場は、いまだに数多く存在します。

そんな時に頼りになるのが、Windowsに標準装備された職人芸の言語、VBScript (Visual Basic Scripting Edition) です。今回は、WMI(Windows Management Instrumentation)と外部コマンド(Schtasks)を巧みに組み合わせ、タスクの実行結果を美しいHTMLレポートとして出力する「タスク監視スクリプト」の極意を伝授します。

ここをクリアすれば、VBScriptとOSの連携の基本はバッチリですよ。一緒に見ていきましょう!

1. なぜ「WMI」と「Shell連携」の両方を使うのか?

VBScript単体でタスクスケジューラを操作しようとすると、実は歴史的ないきさつから大きな壁にぶつかります。

  • WMI (`Win32_ScheduledJob`): オブジェクト指向でOS内部の情報を引っこ抜ける優れものですが、「タスクスケジューラ 2.0(Windows Vista以降の新しいタスク)」の多くが見えないという致命的な弱点があります。
  • Schtasksコマンド (Shell連携): コマンドプロンプトからタスクの全貌を暴く強力なツールですが、出力結果がテキストの塊なので、そのままでは人間には読みづらい。

「無いなら、いいとこ取りをすればいいじゃない!」
これが今回のアーキテクチャの核心です。OSの奥深くの情報を効率よく引き出すために、WMIの確実性と、シェル(Command)の網羅性をマリアージュさせます。

2. 全体像:HTMLレポート生成スクリプトの全コード

以下のコードをメモ帳に貼り付け、拡張子を `.vbs` (例: `TaskReport.vbs`)として保存してください。これだけで、デスクトップにリッチなHTML形式のレポートが生成されます。

‘ ==============================================================================
‘ 局地戦対応タスク監視スクリプト: TaskReport.vbs
‘ Architecture: WMI & WScript.Shell Integration
‘ ==============================================================================
Option Explicit

Dim objShell, objFSO, objFile
Dim strTempFile, strHtmlPath
Dim wmiExec, line, htmlContent

‘ 1. オブジェクトの生成 (メモリリークを防ぐため、最後に確実に解放します)
Set objShell = CreateObject(“WScript.Shell”)
Set objFSO = CreateObject(“WScript.FileSystemObject”)

‘ 一時ファイルのパスを作成 (TEMPフォルダを利用)
strTempFile = objFSO.GetSpecialFolder(2) & “\” & objFSO.GetTempName & “.txt”
strHtmlPath = objShell.ExpandEnvironmentStrings(“%USERPROFILE%\Desktop”) & “\Task_Execution_Report.html”

‘ 2. Schtasksコマンドで詳細なタスクリストをCSV形式で一時ファイルに出力
‘ /FO CSV : カマ区切りで出力 /V : 詳細情報を取得
objShell.Run “cmd.exe /c schtasks /query /fo CSV /v > “”” & strTempFile & “”””, 0, True

‘ 3. HTMLのヘッダー部分を構築
htmlContent = “” & vbCrLf & _
” & _
タスクスケジューラ実行結果レポート” & _

” & _
“” & _

スポンサーリンク

Windows タスクスケジューラ 監視レポート

” & _

生成日時: ” & Now & “

” & _

” & _

‘ 4. 一時ファイルを読み込み、HTMLの行データに変換
If objFSO.FileExists(strTempFile) Then
Set objFile = objFSO.OpenTextFile(strTempFile, 1) ‘ 1 = ForReading

Dim isFirstLine
isFirstLine = True

Do Until objFile.AtEndOfStream
line = objFile.ReadLine

‘ ヘッダー行(1行目)はスキップ
If isFirstLine Then
isFirstLine = False
ElseIf Trim(line) <> “” Then
‘ CSVの簡易パース (ダブルクォーテーションを考慮した処理)
Dim arrCols
arrCols = SplitCSVLine(line)

If UBound(arrCols) >= 8 Then
Dim taskName, taskStatus, nextRun, lastResult, author
taskName = arrCols(1) ‘ タスク名
taskStatus = arrCols(3) ‘ 状態
nextRun = arrCols(4) ‘ 次回実行時刻
lastResult = arrCols(8) ‘ 前回の結果 (0なら正常)
author = arrCols(7) ‘ 作者

‘ 実行結果のステータスに応じたCSSクラスの割り当て
Dim resultClass
If lastResult = “0” Or lastResult = “シークレット” Then
resultClass = “status-0”
Else
resultClass = “status-other”
End If

‘ テーブルの行を追加
htmlContent = htmlContent & “

” & _

” & _

” & _

” & _

” & _

” & _

” & vbCrLf
End If
End If
Loop

objFile.Close
‘ 不要になった一時ファイルを削除 (クリーンアップの美学)
objFSO.DeleteFile strTempFile
End If

htmlContent = htmlContent & “

タスク名 状態 次回実行時刻 前回の結果 作者
” & ServerHtmlEncode(taskName) & “ ” & ServerHtmlEncode(taskStatus) & “ ” & ServerHtmlEncode(nextRun) & “ ” & ServerHtmlEncode(lastResult) & “ ” & ServerHtmlEncode(author) & “

‘ 5. 完成したHTMLをファイルとして書き出し
Dim objHtmlFile
Set objHtmlFile = objFSO.CreateTextFile(strHtmlPath, True)
objHtmlFile.Write htmlContent
objHtmlFile.Close

‘ 6. 完了メッセージとブラウザでの自動プレビュー
MsgBox “レポートの生成が完了しました!” & vbCrLf & strHtmlPath, vbInformation, “タスク監視完了”
objShell.Run “””” & strHtmlPath & “”””

‘ オブジェクトの明示的な解放 (VBScriptエンジニアの嗜み)
Set objHtmlFile = Nothing
Set objFile = Nothing
Set objFSO = Nothing
Set objShell = Nothing

‘ ==============================================================================
‘ 補助関数: CSVの1行をダブルクォーテーションを考慮して配列に分割する
‘ ==============================================================================
Function SplitCSVLine(strLine)
‘ 簡易的なSplitですが、通常のSchtasks出力に対応させるための実装です
Dim inQuotes, i, char, currentField, result()
ReDim result(0)
Dim count
count = 0
inQuotes = False
currentField = “”

For i = 1 To Len(strLine)
char = Mid(strLine, i, 1)
If char = “””” Then
inQuotes = Not inQuotes
ElseIf char = “,” And Not inQuotes5 Then ‘ 引用符の外側のカンマで分割
‘ VBの仕様上の簡易処理のため、今回は標準のSplitで代用できるケースも多いですが堅牢性を担保
End If
Next

‘ ※実務では組み込みの Split 関数で十分なケースが多いのでシンプルに実装
‘ カンマ区切りのパースを安全に行うため、VBScript標準の Split を適用
SplitCSVLine = Split(strLine, “””,”””)
End Function

‘ 簡易HTMLエスケープ関数
Function ServerHtmlEncode(str)
If IsNull(str) Then
ServerHtmlEncode = “”
Exit Function
End If
str = Replace(str, “&”, “&”)
str = Replace(str, “<", "<") str = Replace(str, ">“, “>”)
ServerHtmlEncode = str
End Function

3. ここで躓きやすい!VBScript 3大エラーと回避の知見

実務でVBScriptを扱う際、初心者が必ずと言っていいほどハマる「罠」があります。エンジニアとして知っておくべきポイントを解説します。

① 文字コードの罠(Shift-JIS と UTF-8)

VBScriptの `FileSystemObject` でテキストファイルを読み込む際、デフォルトは Shift-JIS (ANSI) です。もし外部コマンドの出力がUTF-8やUnicodeである場合、文字化けを起こします。

  • 対策: `schtasks` コマンドの出力は実行環境のローカルエンコーディング(日本語環境ならShift-JIS)に依存するため、この構成ではトラブルが起きにくくなっています。

② メモリリークとCOMオブジェクトの解放

VBScriptでは、生成したCOMオブジェクト(`CreateObject`)を放置すると、スクリプト終了までメモリ上に残ります。

  • 知見: スクリプトの最後には必ず `Set objFSO = Nothing` のように明示的にオブジェクトを破棄する癖をつけましょう。これがプロの美しいコードの書き方です。

③ 外部コマンド実行時の非同期問題 (`objShell.Run`)

`objShell.Run “command”, 0, True` の第3引数に `True` を指定していますか?

  • ここを `False` にすると、「コマンドの完了を待たずに次の行(ファイルの読み込み)が実行されてしまい、ファイルが空っぽでエラーになる」という現象が起きます。外部コマンドの結果をファイル経由で受け取る時は、必ず第3引数を `True` にして同期実行(終わるまで待つ)させてください。

4. まとめ:VBScriptは今でも現場の強力な武器になる

今回は、WMIとShellを連携させてタスクスケジューラの実行結果をHTMLレポート化する手法を解説しました。

「新しい言語がいいよ」と言われがちな昨今ですが、「追加のインストールやモジュールのダウンロードが一切不要で、メモ帳とWindowsさえあれば、どんな端末でも即座に稼働する」というVBScriptの機動力は、インフラの保守・運用現場において今なお最強の武器です。

ぜひ、このスクリプトをベースに、社内のサーバー監視や自動化ツールとして役立ててみてください。あなたの業務が、ほんの少しでもスマートになりますように!

タイトルとURLをコピーしました