こんにちは!現場のシステム運用で「毎日のタスクが本当に正常終了しているか、一目でわかるレポートが欲しいなぁ」と悩んだことはありませんか?
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 & “
” & _
“
| タスク名 | 状態 | 次回実行時刻 | 前回の結果 | 作者 |
|---|---|---|---|---|
| ” & 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の機動力は、インフラの保守・運用現場において今なお最強の武器です。
ぜひ、このスクリプトをベースに、社内のサーバー監視や自動化ツールとして役立ててみてください。あなたの業務が、ほんの少しでもスマートになりますように!
