こんにちは!VBScriptの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩抜け出し、自分の手でWindowsのOSを自在にコントロールしたいと思っているあなたなら、きっとこの扉を開けるワクワク感を感じているはずです。
今回は、業務自動化の現場で「絶対に避けて通れない、けれどめちゃくちゃ重要なテクニック」である、一時ファイル(テンポラリファイル)の安全な扱い方についてお話しします。
「処理の途中でデータをちょっとだけ保存したい」
「他のプログラムとファイル名が被ってエラーになったことがある」
「処理が終わったあとにゴミファイルがPCに残ってしまって気まずい…」
そんな悩みをすべて解決する、プロの知見が詰まったワークファイル管理法を伝授しましょう。ここをクリアすれば、あなたの書くVBScriptの信頼性はプロのレベルへとグッと引き上げられますよ。それでは、一緒に見ていきましょう!
—
1. なぜ「一時ファイル」の扱いがプロの分かれ道なのか?
VBScriptでファイル操作をする際、適当な名前(例えば `C:\temp.txt` など)で作業用ファイルを作っていませんか?
もし、そのスクリプトが同時に2つ実行されたらどうなるでしょうか? あるいは、すでに同名のファイルがたまたま存在していたら?
——はい、データが上書きされて消えたり、アクセス権エラーでスクリプトがクラッシュしたりします。
さらに、処理が途中でエラー終了したときに、ゴミファイルが延々と残り続ける「デジタルゴミ屋敷」状態を作る原因にもなります。
これをスマートに解決するのが、FSO(FileSystemObject)が持つ`GetSpecialFolder`と`GetTempName`という2つの強力な武器です。
—
2. 秘密兵器の正体:GetSpecialFolder と GetTempName
まずは、今回主役となる2つの仕組みを整理しておきましょう。
1. `GetSpecialFolder(2)` (Windows標準のテンポラリフォルダ)
- 「C:\Windows\Temp」や「C:\Users\用户名\AppData\Local\Temp」など、OSが一時置き場として用意している聖域をピンポイントで取得します。PCの環境に依存しないため、どこで動かしても安全です。
2. `GetTempName` (衝突しないランダム名生成)
- 実行するたびに、`radA1B2.tmp` のような絶対に他のファイルと被らないユニークな名前を自動生成してくれます。
この2つを組み合わせることで、「安全な場所に、誰とも被らない名前でファイルを作り、用が済んだら消す」という完璧なライフサイクルが完成します。
—
3. 【実践】安全なテンポラリファイル生成と自動消去のコード
それでは、実際の現場でそのまま使える、堅牢なスクリプトを見てみましょう。
メモ帳に貼り付けて `temp_sample.vbs` という名前で保存し、実行してみてください。
Option Explicit
‘ =================================================================
‘ テーマ: 安全なテンポラリファイルの生成と確実な自動消去
‘ 解説: 先輩エンジニアからの実践的コード
‘ =================================================================
Sub Main()
Dim fso, ts, tempFolder, tempFileName, tempFilePath
‘ 1. FileSystemObjectの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
On Error Resume Next ‘ 万が一のエラーでも後処理を確実に行うための保険
‘ 2. OSの標準Tempフォルダのパスを取得 (引数 2 が Tempフォルダを指します)
Set tempFolder = fso.GetSpecialFolder(2)
‘ 3. 衝突しない一意のテンポラリファイル名を自動生成
tempFileName = fso.GetTempName()
tempFilePath = fso.BuildPath(tempFolder, tempFileName)
WScript.Echo “【生成】以下のパスに安全な一時ファイルを作成します:” & vbCrLf & tempFilePath
‘ 4. ファイルを開いてデータを書き込む (新規作成・上書き)
‘ 第2引数の「2」は書き込み専用、「True」は存在しない場合に新規作成する指定
Set ts = fso.CreateTextFile(tempFilePath, True, False)
If Err.Number <> 0 Then
WScript.Echo “エラー: ファイルの作成に失敗しました。” & Err.Description
Exit Sub
End If
‘ 業務データの書き込みシミュレーション
ts.WriteLine “— 処理データ開始 —”
ts.WriteLine “実行日時: ” & Now
ts.WriteLine “ステータス: 正常稼働中”
ts.WriteLine “— 処理データ終了 —”
‘ ファイルを閉じてリソースを解放
ts.Close
‘ =================================================================
‘ ここで本来の重い処理や、外部ツールとの連携を行います
‘ =================================================================
WScript.Echo “【処理中】一時ファイルを使った処理を実行中…”
WScript.Sleep 2000 ‘ 2秒間待機(処理の擬似再現)
‘ =================================================================
‘ 5. 【最重要】お掃除処理 (Clean Up)
‘ =================================================================
If fso.FileExists(tempFilePath) Then
fso.DeleteFile tempFilePath, True ‘ 第2引数Trueで読み取り専用も強制削除
WScript.Echo “【消去】一時ファイルを綺麗にお掃除しました。お疲れ様です!”
End If
‘ オブジェクトの解放
Set ts = Nothing
Set tempFolder = Nothing
Set fso = Nothing
On Error GoTo 0 ‘ エラー監視を元に戻す
WScript.Echo “すべての処理が安全に完了しました。”
End Sub
‘ メイン処理の実行
Main()
—
4. コードの深掘りポイント(ここが分かれば一人前!)
① なぜ `On Error Resume Next` を使うのか?
プログラミング初学者が最も恐れるのが「途中でエラーが起きてスクリプトが止まり、ファイルが開きっぱなしになること」です。
あえてエラー無視の構文を挟みつつ、最後に「ファイルが存在していれば強制削除する(`fso.DeleteFile …, True`)」というディフェンシブな設計にすることで、どんな状況でもゴミを残さない仕組みを作っています。これが実務で信頼されるコードの書き方です。
② オブジェクトの適切な解放
VBScriptでは、メモリリーク(メモリの解放漏れ)を防ぐために、使い終わったオブジェクト(`Set ts = Nothing` や `Set fso = Nothing`)を明示的に空にするのが美しい作法です。スクリプトが小規模ならOSが勝手に回収してくれますが、こうした丁寧な習慣が質の高いエンジニアを育てます。
—
おわりに
いかがでしたでしょうか?
今回は、`GetSpecialFolder` と `GetTempName` を使った、安全でスマートな一時ファイル管理法について解説しました。
「動けばいいや」というコードから、「エラーが起きても環境を汚さない、美しく堅牢なコード」へ。この視点を持てたなら、あなたはもうただの初心者ではありません。立派な自動化エンジニアの第一歩を踏み出しています。
ここをクリアしたあなたなら、VBScriptの基本はもうバッチリですよ!
日々の面倒なルーティンワークを、自分の手で鮮やかに自動化していきましょう。それでは、次回の実践的な知見もお楽しみに!
