【VBScript】空白パスで死なない!「8.3形式」で外部コマンドを確実に操る極意
こんにちは。現場で長年システム自動化を支えてきたエンジニアです。
VBScriptで「外部コマンド(WScript.ShellのRunメソッドなど)」を叩こうとして、「そんなファイルは見つかりません」というエラーに頭を抱えた経験はありませんか?
その原因の9割は、ファイルパスに含まれる「空白(スペース)」にあります。Windowsは昔からの仕様で、パスに空白があると「ここで引数が区切られた!」と勘違いして正しくファイルを認識できなくなるのです。
今日は、そんなトラブルを「8.3形式(ショートパス)」という魔法の変換技術で根本解決する方法を伝授します。これさえ覚えれば、パスの空白問題はもう怖くありません。
—
なぜ「空白」がエラーを招くのか?
例えば、あなたが `C:\My Documents\data.txt` というファイルを処理したいとします。
外部コマンドにこの文字列を渡すと、コマンドプロンプトは以下のように解釈してしまいます。
1. コマンド:「C:\My」を実行しようとする
2. 引数:「Documents\data.txt」という余計なものが付いている
当然、`C:\My` なんてプログラムは存在しないのでエラーになります。引用符(`”`)で囲めば回避できることもありますが、コマンド側の仕様によってはそれでも動かないケースが多々あります。
ここで登場するのが、Windowsが持つ「8.3形式(ショートパス)」という古くて新しい知恵です。
—
魔法のプロパティ:`ShortPath` を使おう
VBScriptの `FileSystemObject (FSO)` を使えば、どんなに長いパスでも、空白を含まない「8.3形式」の短いパスに瞬時に変換できます。
基本コード:こう書くのがプロの流儀
‘ FSOオブジェクトの生成
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
‘ ターゲットとなるファイルパス(空白を含む)
strLongPath = “C:\Users\Username\Documents\My Project\report.csv”
‘ ファイルオブジェクトを取得
Set objFile = objFSO.GetFile(strLongPath)
‘ 8.3形式(ショートパス)を取得
‘ 例: C:\Users\USERNA~1\DOCUME~1\MYPROJ~1\REPORT~1.CSV
strShortPath = objFile.ShortPath
‘ これを外部コマンドに渡す
Set objShell = CreateObject(“WScript.Shell”)
‘ ショートパスなら空白がないので、引用符なしでも確実に動作する
objShell.Run “notepad.exe ” & strShortPath, 1, True
‘ 後始末(メモリリークを防ぐ)
Set objFile = Nothing
Set objFSO = Nothing
Set objShell = Nothing
—
コードのポイント:なぜこれが「最強」なのか
1. `GetFile` で対象を特定:
FSOの `GetFile` メソッドは、指定したパスのファイルシステム上の実体を掴みます。これができないと `ShortPath` プロパティにはアクセスできません。
2. `ShortPath` プロパティの恩恵:
Windowsは互換性のため、長いファイル名に対して必ず `PROGRA~1` のような「8文字以内+チルダ」の短い別名を持っています。これを利用することで、空白文字を物理的に消滅させることができます。
3. `ShortName` との違い:
`ShortPath` は「パス全体(ディレクトリ含む)」を変換しますが、`ShortName` は「ファイル名だけ」を変換します。コマンド実行にはフルパスが必要なので、基本は `ShortPath` を使いましょう。
—
初学者が陥りやすい「落とし穴」
1. ファイルが存在しないとエラーになる
`objFSO.GetFile(strLongPath)` は、そのファイルが実際に存在しないとエラーを吐いて停止します。
実行前に `If objFSO.FileExists(strLongPath) Then …` と記述し、存在確認をするのが現場の鉄則です。
2. ネットワークパス(UNC)の罠
`\\Server\Share\file.txt` のようなUNCパスにはショートパスが存在しない場合があります。このテクニックは「ローカルドライブ上のファイル」に対して使うのが最も安全で確実です。
—
まとめ:この知見で自動化の質を高める
VBScriptは古い言語ですが、Windowsの深い部分(ファイルシステム層)を直接叩ける非常に強力なツールです。
- 空白パスは「8.3形式」へ逃がすのが鉄則
- `ShortPath` プロパティは救世主
- 必ず `FileExists` で事前チェックする
この3点を押さえるだけで、あなたの書く自動化スクリプトの安定性は劇的に向上します。マクロの記録から脱却し、こうした「OSの作法」を理解したコードを書けるようになれば、あなたはもう初心者ではありません。
ぜひ、次の現場で使ってみてください。応援しています!
