【入門編】【Windowsタスク一覧出力】WMI Win32_ScheduledJob と外部コマンド連携によるタスクスケジューラ情報の可視化 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場でバリバリ自動化を進めていると、「今、このサーバーにはどんな定期タスク(スケジュールタスク)が登録されているんだっけ?」と確認したくなる瞬間が必ず訪れます。

GUIのタスクスケジューラーをポチポチ開いて確認するのもいいですが、サーバーが何台もあったり、日々の保守ドキュメントとして自動でリスト化しておきたかったりするときには、やっぱりスクリプトによる自動化が最強の武器になります。

今回は、VBScriptとWindowsの仕組み(WMIと外部コマンド)を組み合わせて、システム上のタスク情報を綺麗にファイル出力する実用的なスクリプトを一緒に作っていきましょう。

ここをクリアすれば、VBScriptを使ったOS情報の取得やファイル操作の基本はバッチリですよ!温かく導いていくので、リラックスしてついてきてくださいね。

なぜ「WMI」と「外部コマンド」を組み合わせるのか?

Windowsのタスク情報を取得するアプローチにはいくつかありますが、VBScriptの世界では大きく分けて2つの方法があります。

1. `Win32_ScheduledJob` (WMI) を使う方法
OSの深層部分を管理するWMI(Windows Management Instrumentation)経由で取得する方法です。オブジェクトとして綺麗にデータを扱えるメリットがありますが、実はOSのセキュリティ強化に伴い、現在のモダンなWindows環境では「ATコマンド互換の古いタスク」しか見えないという制限があります。
2. `schtasks` コマンドを使う方法
Windows標準のタスク管理コマンド(`schtasks.exe`)をVBScriptから実行し、その結果を受け取る方法です。現代のタスクスケジューラーで登録された複雑なタスクもすべて網羅できるため、実務ではこちらを組み合わせるのが最も確実でスマートです。

今回は、VBScriptのオブジェクト指向的な書き方の基礎を学びつつ、実務で100%使える「外部コマンド連携」のテクニックをマスターしましょう。

現場でそのまま使える!タスク一覧出力スクリプト

以下のコードをメモ帳に貼り付けて、ファイル名を `ExportTasks.vbs` として保存してください。(文字コードは `Shift-JIS` または `BOM付きUTF-8` がおすすめです)

‘ ==============================================================================
‘ 処理名 : Windowsスケジュールタスク一覧出力スクリプト
‘ 概要 : schtasksコマンドを利用して全タスクの情報を取得し、
‘ デスクトップにCSV形式の保守定義書として出力する
‘ ==============================================================================

Option Explicit ‘ 宣言漏れの変数をエラーにする(バグ防衛の基本!)

‘ 定数の定義
Const
Const ForWriting = 2
Const CreateTrue = True

Dim objShell, objFSO
Dim strDesktopPath, strOutputPath
Dim objExec, strCommand, strResult

‘ 1. オブジェクトの生成
Set objShell = CreateObject(“WScript.Shell”)
Set objFSO = CreateObject(“Scripting.FileSystemObject”)

‘ 2. 出力先パスの動的取得(実行ユーザーのデスクトップ)
strDesktopPath = objShell.SpecialFolders(“Desktop”)
strOutputPath = strDesktopPath & “\Task_Definition_Report.csv”

WScript.Echo “タスク情報の取得を開始します。しばらくお待ちください…”

‘ 3. schtasksコマンドの実行(CSV形式で全タスク、詳細情報を取得)
‘ /FO CSV : 出力形式をCSVにする
‘ /V : 詳細情報(実行ユーザーや次回実行日時など)を表示する
strCommand = “schtasks /Query /FO CSV /V”

‘ WScript.Shellの Exec メソッドを使うことで、コマンドの実行結果(標準出力)をストリームで取得できます
Set objExec = objShell.Exec(strCommand)
strResult = objExec.StdOut.ReadAll

‘ 4. 取得した結果をテキストファイル(CSV)として書き出し
Dim objFile
Set objFile = objFSO.OpenTextFile(strOutputPath, ForWriting, CreateTrue)
objFile.Write strResult
objFile.Close

‘ 5. 後片付けと完了通知
Set objFile = Nothing
Set objExec = Nothing
Set objFSO = Nothing
Set objShell = Nothing

WScript.Echo “処理が完了しました!” & vbCrLf & _
“出力先: ” & strOutputPath

コードの重要ポイントを徹底解説!

初心者から一歩抜け出すために、このスクリプトに散りばめられている「VBScriptを極めるための重要エッセンス」を3つに絞って解説します。

① `Option Explicit` はエンジニアの命綱

コードの2行目に書かれている `Option Explicit`。これ、地味ですがプログラミングのプロほど必ず書くお約束です。
VBScriptはデフォルトでは、変数のスペルミス(例: `strPath` と書くべきところを `strPah` と打ってしまった場合)があっても、エラーにならず「空の変数」として勝手に処理を進めてしまいます。これが原因不明のバグを生む最大の原因になります。
`Option Explicit` を宣言しておくと、「宣言していない変数を使ったら即座にエラーで止めてくれる」ようになるため、開発効率が劇的に跳ね上がります。

② `WScript.Shell` の `Exec` と `Run` の使い分け

外部コマンドをたたく際によく使われるのが `Run` メソッドですが、今回は `Exec` メソッドを採用しています。

  • `Run` メソッド:コマンドを「実行するだけ」。結果の文字データをプログラム側で受け取るのが難しい。
  • `Exec` メソッド:コマンドを実行しつつ、その出力結果(コンソールに流れる文字)を `StdOut.ReadAll` で丸ごと変数にキャプチャできる

今回は「コマンドの結果をファイルに保存したい」という要件があるため、`Exec` が大正解なのです。

③ 動的なパス取得 (`SpecialFolders`)

コード内で `strDesktopPath = objShell.SpecialFolders(“Desktop”)` という記述をしています。
固定で `”C:\Users\Yamada\Desktop\…”` と書いてしまうと、別のパソコンで実行したときにユーザー名が違ってエラーになってしまいます。`SpecialFolders` を使えば、今このスクリプトを動かしているユーザーのデスクトップパスを自動で特定してくれます。こういう細かい配慮が、現場で信頼されるツールの条件です。

陥りやすい罠とエラー対策

VBScriptを運用する中で、多くの人がハマるポイントを先回りして共有しておきますね。

トラブル1: 文字化けが発生する

`schtasks` コマンドはWindowsのシステム言語(日本語版ならShift-JIS)で出力を行います。VBScriptで標準のテキストファイル出力(`OpenTextFile`)を行うと、環境によっては文字化けすることがあります。
もしExcelで開いたときに文字化けする場合は、出力されたCSVファイルを一度メモ帳で開き、「名前を付けて保存」から文字コードを「ANSI」または「Shift-JIS」に指定して上書き保存してみてください。

トラブル2: 権限不足(アクセスが拒否されました)

企業のセキュリティポリシーやドメイン環境によっては、一般権限のユーザーで `schtasks /V` を実行すると、一部のタスク情報(特にSYSTEM権限や他ユーザーで動くタスクの詳細)の取得に制限がかかることがあります。
もし「データが一部欠けているな」と感じたら、スクリプトファイルを右クリックし、「管理者として実行」を試してみてください。

おわりに

今回は、VBScriptと外部コマンド(`schtasks`)を優しく連携させ、実務で即戦力となるスケジュールタスク一覧の自動出力スクリプトを構築しました。

  • OSの機能をフルに活かすならWMIだけでなく外部コマンドの力も借りる
  • `Option Explicit` でバグを未然に防ぐ
  • 環境に依存しないパスの動的取得を行う

これらはVBScriptに限らず、あらゆる自動化プログラミングに通ずる「美しい設計思想」です。ここをクリアできたあなたなら、もうマクロの記録だけの世界には戻れないはず。ぜひ日々の業務の効率化に役立ててくださいね!

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