こんにちは!VBScriptの自動化の世界へようこそ。
マクロの記録から一歩踏み出し、本格的なファイルシステム操作に挑戦していると、避けて通れないのが「パスの壁」です。
今回は、Windowsの歴史的な呪縛である「260文字制限(MAX_PATH)」と、ファイルシステムオブジェクト(FSO)が直面する限界、そして現場で絶対に慌てないための防衛策について、優しく、そして深く解説していきます。
ここをクリアすれば、あなたもVBScriptの挙動を完全に手の内に収めた中級エンジニアの仲間入りですよ。しっかりついてきてくださいね!
—
1. なぜエラーに?「260文字の壁」とFSOの限界
Windows OSの内部では、古くからファイルパスの最大長が「260文字(`MAX_PATH`)」に制限されてきました。
フォルダを何重にも掘り下げ、「`C:\Users\Yamada\Documents\Projects\2023\Clients\A-Company\Development\Reports\Detailed\Results\Final_Output_20231231_Revised_v2.xlsx`」のようなパスを作った覚えはありませんか?
ここでVBScriptの主役である `Scripting.FileSystemObject` (FSO) を使うと、恐ろしい現象が起きます。
実は、FSOはこの260文字の制限を自力で回避する能力を持っていません。 パスが260文字を超えた瞬間に、FSOは冷徹に「パスが見つかりません」といった致命的な例外(エラー)を発生させ、スクリプトを強制終了させてしまうのです。
「えっ、じゃあ深い階層のファイルはVBScriptじゃ操作できないの?」
いいえ、安心してください。先人が編み出した「確実な回避ルート」がちゃんと用意されています。
—
2. 救世主「ShortPath(ショートパス)」プロパティの正体
Windowsのファイルシステムには、長大なパスを救うための裏技が用意されています。それが「8.3形式(ショートパス)」です。
例えば、`C:\VeryLongFolderName\SubFolder…` という長大なフォルダであっても、ファイルシステムに問い合わせれば、OSが自動的に `C:\VERYLO~1\SUBFOL~1` のような短い別名を割り当てています。
FSOの `Folder` オブジェクトや `File` オブジェクトには、この短いパスを返す `ShortPath` というプロパティが存在します。
これを利用すれば、長大なパスを安全に短いパスに変換し、FSOの限界を華麗にかわすことができるのです。
実践!ショートパスを活用した安全なファイル操作コード
以下のコードは、深い階層にあるファイルサイズを取得する際、文字数制限によるエラーを防ぐための防衛的コードのサンプルです。そのままコピーして使えます。
Option Explicit
Dim fso, targetPath, folder, file, safePath
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ※実際にはここに260文字を超えるような深すぎるパスが入ると想定してください
targetPath = “C:\TestFolder\SubFolder\DeepDirectory…”
On Error Resume Next ‘ エラーでのスクリプト強制終了を防ぐ防衛策
‘ フォルダオブジェクトの取得
Set folder = fso.GetFolder(targetPath)
If Err.Number <> 0 Then
WScript.Echo “【警告】フォルダの取得に失敗しました。パスが長すぎるか、存在しません。”
WScript.Echo “エラー詳細: ” & Err.Description
Err.Clear
Else
‘ ショートパス(8.3形式)を取得してFSOの制限を回避
safePath = folder.ShortPath
WScript.Echo “安全なショートパスに変換しました: ” & safePath
‘ ここから先の処理は safePath をベースに行うと安全です
End If
On Error GoTo 0 ‘ エラー監視を通常に戻す
Set file = Nothing
Set folder = Nothing
Set fso = Nothing
—
3. 現場で失敗しないための「パス設計」3か条
コードレベルでの対策(`ShortPath` や `On Error` によるハンドリング)も大切ですが、プロのエンジニアとして最も重要なのは「そもそも長大なパスを作らない・持ち込まない設計」です。
1. ルートの浅い場所で作業する
一時ファイルやバッチ処理のワークスペースは、できる限り `C:\Work` や `D:\Tmp` など、ルートに近い浅い階層に配置しましょう。
2. ネットワークドライブの割り当て(SUBST / ネットドライブ)
共有フォルダのパスが `\\server01\dept\sales\2023\…\` のように長くなっている場合は、`net use` コマンドや `subst` コマンドを使ってドライブレター(`Z:\` など)に置き換えてからVBScriptを実行すると、文字数を大幅に削減できます。
3. レジストриやマニフェストによる制限解除(上級者向け)
Windows 10/11 以降では、OSの設定やレジストリで「長いパス(Long Paths)」を有効にすることが可能です。ただし、VBScript(FSO)自体はAPIの仕様上、依然として影響を受けるケースがあるため、過信は禁物です。
—
おわりに
いかがでしたでしょうか?
今回は、FSOの隠れた弱点である「260文字制限」と、それを乗りこなすための `ShortPath` の知見をお伝えしました。
「動くけれど、深い階層になると突然止まる……」という現場のトラブルは、この仕組みを知っていれば恐くありません。
エラーを予測し、防衛策を組み込んだ堅牢なスクリプトを書けるようになると、VBScriptのスキルは一気にプロの領域へ到達します。
ここをクリアしたあなたなら、どんな複雑なファイル整理自動化もバッチリこなせますよ。ぜひ日々の業務に活かしてみてくださいね!
