VBScriptを「タスクスケジューラ」で飼いならす:カレントディレクトリの罠と解決策
こんにちは。自動化の現場でVBScriptと長く付き合ってきたエンジニアです。
皆さんがせっせと書いたVBScript、手動でダブルクリックすれば完璧に動くのに、「タスクスケジューラに登録した途端、ファイルが見つからないエラーが出る」「相対パスで指定したログファイルがどこにも生成されない」……そんな経験はありませんか?
実はこれ、VBScriptのバグではなく、「実行環境の前提条件」が根本的に異なるために発生する、自動化エンジニアが必ず一度は通る「通過儀礼」のようなものなのです。
今日は、なぜこの問題が起きるのか、そしてどうすれば「どんな環境でも確実に動く」スクリプトに昇華できるのか。その極意を伝授します。
—
1. なぜ「カレントディレクトリ」が迷子になるのか?
VBScriptをダブルクリックで実行する際、OSはそのスクリプトファイルが存在するフォルダを「カレントディレクトリ(作業フォルダ)」として認識します。
しかし、タスクスケジューラから実行する場合、作業フォルダは通常 `C:\Windows\System32` に設定されてしまいます。
もしあなたのコードの中に、
`Set objFile = objFSO.OpenTextFile(“config.ini”, 1)`
という記述があったらどうなるか? スクリプトは `System32` フォルダの中に `config.ini` を探しに行き、当然ながら「ファイルが見つかりません」というエラーを吐いて沈黙します。
これが、自動化を阻む「カレントディレクトリの罠」の正体です。
—
2. 解決策:スクリプト自身を「現在地」として強制する
解決策はシンプルです。「どこから呼ばれても、自分自身のファイル場所を起点にする」というルールを、コードの冒頭で宣言してあげればいいのです。
以下のコードを、あなたのスクリプトの「最上部(1行目)」に書き加えてください。
‘ — カレントディレクトリをスクリプト自身の場所へ強制セットする —
Dim objShell
Set objShell = CreateObject(“WScript.Shell”)
‘ WScript.ScriptFullName は自身のフルパスを返します
‘ fsoを使ってその親フォルダを取得し、カレントディレクトリに設定します
Dim fso, scriptPath
Set fso = CreateObject(“Scripting.FileSystemObject”)
scriptPath = fso.GetParentFolderName(WScript.ScriptFullName)
‘ ここが重要:作業フォルダを強制的に変更する
objShell.CurrentDirectory = scriptPath
‘ 確認用の出力(開発時はコメントアウトを外すと便利です)
‘ WScript.Echo “現在の作業場所は: ” & objShell.CurrentDirectory
—
3. 実践:タスクスケジューラ設定時の「黄金のルール」
コードの修正に加えて、タスクスケジューラのプロパティ画面で以下の設定を行うのが、プロの現場の鉄則です。
1. 「全般」タブ: 「最上位の特権で実行する」にチェックを入れる(権限不足によるエラーを防ぐため)。
2. 「操作」タブ: 「開始(オプション)」欄に、必ずスクリプトが存在するフォルダパスを入力してください。
この「開始(オプション)」欄を空欄にせず、明示的に指定することで、スクリプト実行時の迷子率を劇的に下げることができます。
—
4. 陥りやすいエラーとデバッグの極意
初心者がよくやるのが、エラー発生時に「なぜ動かないのか」を勘で修正することです。VBScriptは歴史ある言語ですが、現代のデバッグ手法を併用しましょう。
- 相対パスを避ける(可能な限り):
どうしてもパスを指定する場合は、上記で取得した `scriptPath` を変数に入れて、フルパスで結合してください。
`filePath = scriptPath & “\data\log.txt”` のように書けば、迷うことはありません。
- WScript.Echo を過信しない:
タスクスケジューラで実行すると `WScript.Echo` のダイアログは表示されません。エラーを追うときは、`CreateObject(“Scripting.FileSystemObject”).OpenTextFile(…)` を使って、ファイルへログを書き出す手法を身につけましょう。
—
まとめ:自動化の質を一段階上げよう
VBScriptは古い言語と言われますが、WindowsのOS標準機能だけで動くその軽量さは、今なお自動化の強力な武器です。「なぜ動かないのか?」と悩む時間は、OSの仕様を理解するための最高の学習時間です。
今回紹介した「カレントディレクトリの補正」をマスターすれば、あなたのスクリプトは単なる「ファイル」から、サーバー上のどこに置いても文句を言わずに働き続ける「堅牢なツール」へと進化します。
ここをクリアできれば、VBScriptの基本はもうバッチリ。自信を持って、次の自動化ステップへ進んでください。応援しています!
