【入門編】【パス解析の基礎】GetExtensionNameとGetBaseNameを用いたファイル自動分類・拡張子別振り分けスクリプトの作成 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptの極意:ファイルパス解析の裏技!GetExtensionNameとGetBaseNameで「ファイル整理」を自動化しよう!

皆さん、こんにちは!VBScriptの世界へようこそ。今日は、皆さんが日々のファイル整理で「あー、あのファイルどこだっけ?」と悩む時間を劇的に減らすための、とっておきのテクニックをご紹介します。「マクロの記録」から一歩踏み出し、VBScriptのパワフルな機能を使いこなして、あなたのPC作業をスマートに自動化してみませんか?

特に、ダウンロードフォルダに溜まりがちな様々な種類のファイルを、拡張子ごとに自動で振り分けるスクリプトを作成していきます。このスクリプトをマスターすれば、VBScriptのファイル操作の基本がグッと身につきますよ!

なぜファイルパスの解析が重要なのか?

PCを使っていると、ファイルはどんどん増えていきますよね。特に、インターネットからダウンロードしたファイルや、一時的に作成したファイルなどは、気づけばダウンロードフォルダがごちゃごちゃになっている…なんてことも。

こんな時、「画像ファイルだけまとめて見たいな」「プログラムファイルは別のフォルダに移動したいな」と思ったことはありませんか?

ファイルパスを正確に解析できれば、ファイルの種類(拡張子)やファイル名そのものをプログラムで判別できるようになります。そして、それを元にファイルを移動させたり、コピーしたり、削除したりといった操作を自動化できるのです。

VBScriptには、このファイルパス解析を驚くほど簡単にしてくれる、素晴らしい「メソッド(命令)」が用意されています。それが、今回使う `GetExtensionName` と `GetBaseName` です。

ファイルシステムオブジェクト(FSO)の扉を開こう!

VBScriptでファイルやフォルダを操作するには、まず `FileSystemObject` という特別な「オブジェクト」を生成する必要があります。このオブジェクトが、ファイルやフォルダに関するあらゆる操作の「窓口」となってくれるんです。

‘ FileSystemObjectを作成します
Set objFSO = CreateObject(“Scripting.FileSystemObject”)

コード解説:

  • `Set objFSO = …`: `objFSO` という名前の変数に、`FileSystemObject` の「インスタンス(実体)」を代入しています。「`Set`」キーワードは、オブジェクトを代入する際に必ず必要なので覚えておきましょう。
  • `CreateObject(“Scripting.FileSystemObject”)`: これが、`FileSystemObject` を生成する命令です。`”Scripting.FileSystemObject”` という文字列で、どのオブジェクトを作ってほしいかを指定しています。

この一行を実行するだけで、ファイル操作の魔法が使えるようになります!

GetExtensionName:拡張子をスマートに「抜き出す」!

`GetExtensionName` メソッドは、指定したファイルパスから、そのファイルの「拡張子」だけを取り出してくれる優れものです。

例えば、「`document.pdf`」というファイルパスがあったら、「`.pdf`」という文字列を返してくれます。

実際に使ってみよう!

‘ ファイルパスを定義します
strFilePath = “C:\Users\YourName\Documents\important_report.docx”

‘ FileSystemObjectを作成します(まだ作成していない場合)
If objFSO Is Nothing Then
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
End If

‘ GetExtensionNameメソッドを使って拡張子を取得します
strExtension = objFSO.GetExtensionName(strFilePath)

‘ 結果を表示します
MsgBox “ファイルの拡張子は: ” & strExtension

コード解説:

  • `strFilePath = “…”`: 操作したいファイルのフルパスを `strFilePath` という変数に格納しています。
  • `If objFSO Is Nothing Then … End If`: この部分は、もし `objFSO` がまだ作られていなければ(`Nothing` なら)、新しく `CreateObject` で生成するという、安全のための記述です。スクリプトの途中で繰り返し `CreateObject` するのは無駄ですし、エラーの原因になることもあります。
  • `strExtension = objFSO.GetExtensionName(strFilePath)`: ここが肝心な部分です!`objFSO` オブジェクトの `GetExtensionName` メソッドに、ファイルパス `strFilePath` を渡しています。すると、メソッドはそのパスから拡張子(この例では `.docx`)を抽出して、`strExtension` 変数に返してくれます。
  • `MsgBox “ファイルの拡張子は: ” & strExtension`: `MsgBox` は、画面にメッセージボックスを表示する命令です。`&` は文字列を連結(つなげる)ための演算子です。

実行結果:
「ファイルの拡張子は: .docx」というメッセージボックスが表示されます。

ポイント: `GetExtensionName` が返す拡張子には、先頭に「`.`(ドット)」が含まれます。これは、拡張子を扱う上で非常に便利です。

GetBaseName:拡張子を除いた「ファイル名」をゲット!

次に紹介するのは `GetBaseName` メソッドです。これは、ファイルパスから拡張子を除いた「ファイル名」の部分だけを抽出してくれます。

例えば、「`C:\MyFolder\presentation.pptx`」というパスがあったら、「`presentation`」という文字列を返してくれるのです。

実際に使ってみよう!

‘ ファイルパスを定義します
strFilePath = “C:\Users\YourName\Downloads\image_001.jpg”

‘ FileSystemObjectを作成します(まだ作成していない場合)
If objFSO Is Nothing Then
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
End If

‘ GetBaseNameメソッドを使って拡張子を除いたファイル名を取得します
strBaseName = objFSO.GetBaseName(strFilePath)

‘ 結果を表示します
MsgBox “拡張子を除いたファイル名は: ” & strBaseName

コード解説:

  • `strBaseName = objFSO.GetBaseName(strFilePath)`: `objFSO` オブジェクトの `GetBaseName` メソッドにファイルパス `strFilePath` を渡しています。すると、拡張子(この例では `.jpg`)を除いたファイル名(`image_001`)を抽出して、`strBaseName` 変数に返してくれます。

実行結果:
「拡張子を除いたファイル名は: image_001」というメッセージボックスが表示されます。

ポイント: `GetBaseName` は、ファイル名にドットが含まれていても、最後のドット以降を拡張子とみなして削除します。例えば「`archive.tar.gz`」というファイル名の場合、`GetBaseName` は「`archive.tar`」を返します。これは、複数の拡張子を持つファイル名を扱う際に覚えておくと良いでしょう。

応用編:ダウンロードフォルダを自動整理するスクリプト!

さて、いよいよ本題です!`GetExtensionName` と `GetBaseName` を使って、ダウンロードフォルダにあるファイルを拡張子ごとに自動で振り分けるスクリプトを作成してみましょう。

このスクリプトは、以下のような動作をします。

1. 指定した「ソースフォルダ」(例:ダウンロードフォルダ)内の全ファイルをリストアップします。
2. 各ファイルについて、拡張子を取得します。
3. 拡張子ごとに、あらかじめ作成しておいた「宛先フォルダ」(例:`Images` フォルダ、`Documents` フォルダなど)にファイルを移動させます。
4. もし宛先フォルダがなければ、自動で作成します。

事前準備:

  • ソースフォルダのパスを決定する: 例:「`C:\Users\YourName\Downloads`」
  • 宛先フォルダのベースパスを決定する: 例:「`C:\SortedFiles`」
  • 拡張子と対応するフォルダ名のリストを作成する:
  • `.jpg`, `.png`, `.gif` → `Images`
  • `.docx`, `.xlsx`, `.pptx` → `Documents`
  • `.pdf` → `PDFs`
  • それ以外 → `Others`

VBScriptコード:

‘ — 設定項目 —
Const SOURCE_FOLDER = “C:\Users\YourName\Downloads” ‘ ★★★あなたのダウンロードフォルダのパスに変更してください★★★
Const DEST_BASE_FOLDER = “C:\SortedFiles” ‘ ★★★ファイルを振り分けるベースフォルダのパスに変更してください★★★

‘ 拡張子と宛先フォルダ名のマッピング(小文字で統一すると比較しやすいです)
Dim objExtensionMap
Set objExtensionMap = CreateObject(“Scripting.Dictionary”)
objExtensionMap.Add “.jpg”, “Images”
objExtensionMap.Add “.jpeg”, “Images” ‘ .jpegも画像として扱う
objExtensionMap.Add “.png”, “Images”
objExtensionMap.Add “.gif”, “Images”
objExtensionMap.Add “.bmp”, “Images”
objExtensionMap.Add “.docx”, “Documents”
objExtensionMap.Add “.doc”, “Documents”
objExtensionMap.Add “.xlsx”, “Documents”
objExtensionMap.Add “.xls”, “Documents”
objExtensionMap.Add “.pptx”, “Documents”
objExtensionMap.Add “.ppt”, “Documents”
objExtensionMap.Add “.pdf”, “PDFs”
objExtensionMap.Add “.zip”, “Archives”
objExtensionMap.Add “.rar”, “Archives”
objExtensionMap.Add “.7z”, “Archives”

‘ — スクリプト本体 —

Dim objFSO
Dim objFolder
Dim objFile
Dim strFileName
Dim strExtension
Dim strBaseName
Dim strDestFolder
Dim strFullDestPath

‘ FileSystemObjectを作成します
Set objFSO = CreateObject(“Scripting.FileSystemObject”)

‘ ソースフォルダが存在するか確認します
If Not objFSO.FolderExists(SOURCE_FOLDER) Then
MsgBox “エラー: ソースフォルダが見つかりません。” & vbCrLf & SOURCE_FOLDER, vbCritical, “フォルダエラー”
WScript.Quit ‘ スクリプトを終了します
End If

‘ ベース宛先フォルダを作成します(存在しない場合)
If Not objFSO.FolderExists(DEST_BASE_FOLDER) Then
objFSO.CreateFolder DEST_BASE_FOLDER
WScript.Echo “ベース宛先フォルダを作成しました: ” & DEST_BASE_FOLDER
End If

‘ ソースフォルダ内のファイルを処理します
Set objFolder = objFSO.GetFolder(SOURCE_FOLDER)

WScript.Echo “— ファイル整理を開始します —”
WScript.Echo “ソースフォルダ: ” & SOURCE_FOLDER
WScript.Echo “宛先ベースフォルダ: ” & DEST_BASE_FOLDER

For Each objFile In objFolder.Files
‘ ファイル名と拡張子を取得します
strFileName = objFile.Name
strExtension = LCase(objFSO.GetExtensionName(strFileName)) ‘ 拡張子を小文字に変換して比較
strBaseName = objFSO.GetBaseName(strFileName) ‘ 拡張子を除いたファイル名

WScript.Echo “処理中: ” & strFileName & ” (拡張子: ” & strExtension & “)”

‘ 拡張子に基づいて宛先フォルダを決定します
If objExtensionMap.Exists(strExtension) Then
‘ マッピングされている拡張子の場合
strDestFolder = objFSO.BuildPath(DEST_BASE_FOLDER, objExtensionMap(strExtension))
Else
‘ マッピングされていない拡張子の場合、’Others’フォルダに振り分けます
strDestFolder = objFSO.BuildPath(DEST_BASE_FOLDER, “Others”)
End If

‘ 宛先フォルダを作成します(存在しない場合)
If Not objFSO.FolderExists(strDestFolder) Then
objFSO.CreateFolder strDestFolder
WScript.Echo ” → 宛先フォルダを作成しました: ” & strDestFolder
End If

‘ ファイルを移動します
‘ 既に同名ファイルが存在する場合は上書きせず、エラーメッセージを表示します
Dim strFinalFilePath
strFinalFilePath = objFSO.BuildPath(strDestFolder, strFileName)

If objFSO.FileExists(strFinalFilePath) Then
WScript.Echo ” → 警告: 移動先に同名ファイルが存在します。スキップします: ” & strFileName
Else
On Error Resume Next ‘ エラーが発生しても処理を続行します
objFile.Move strDestFolder
If Err.Number <> 0 Then
WScript.Echo ” → エラー: ファイルの移動に失敗しました。” & vbCrLf & ” ファイル: ” & strFileName & vbCrLf & ” エラーコード: ” & Err.Number & “, 説明: ” & Err.Description
Err.Clear ‘ エラー情報をクリアします
Else
WScript.Echo ” → 移動しました: ” & strFileName & ” → ” & objExtensionMap(strExtension) & “\”
End If
On Error GoTo 0 ‘ エラーハンドリングを元に戻します
End If

Next

WScript.Echo “— ファイル整理が完了しました —”

‘ オブジェクトを解放します(メモリリークを防ぐため)
Set objFile = Nothing
Set objFolder = Nothing
Set objFSO = Nothing
Set objExtensionMap = Nothing

MsgBox “ファイル整理が完了しました。詳細はWScript Echoの出力を確認してください。”, vbInformation, “完了”

コード解説(重要な点):

  • `Const` キーワード: 定数(スクリプト実行中に値が変わらない変数)を宣言します。パスなどの変更しない値は `Const` を使うと、コードが読みやすくなり、意図しない変更を防げます。
  • `Scripting.Dictionary`: 拡張子とフォルダ名の対応付けに `Dictionary` オブジェクトを使っています。これは、キー(拡張子)と値(フォルダ名)のペアを管理するのに非常に便利です。`Add` メソッドで項目を追加し、`Exists` メソッドでキーが存在するか確認し、`objExtensionMap(strExtension)` で対応する値を取得します。
  • `LCase()` 関数: `GetExtensionName` で取得した拡張子を `LCase()` 関数で小文字に変換しています。これにより、`.JPG` や `.Jpg` といった大文字・小文字の違いを気にせずに比較できるようになります。
  • `objFSO.BuildPath(FolderPath, FileName)`: フォルダパスとファイル名(またはサブフォルダ名)を結合して、完全なパス文字列を生成します。パスの区切り文字(`\`)などを自動で処理してくれるため、手動で結合するよりも安全で確実です。
  • `objFile.Move DestinationFolder`: ファイルを移動させる命令です。`DestinationFolder` には、移動先のフォルダパスを指定します。
  • `On Error Resume Next` / `On Error GoTo 0`: エラーハンドリングのための記述です。
  • `On Error Resume Next`: この命令以降でエラーが発生しても、スクリプトの実行を停止せずに次の行に進みます。
  • `Err.Number`, `Err.Description`: エラーが発生した場合、`Err` オブジェクトにエラーコードや説明が格納されます。これを利用して、エラー発生時の詳細を確認できます。
  • `Err.Clear`: エラー情報をクリアします。
  • `On Error GoTo 0`: 通常のエラーハンドリング(エラー発生時にスクリプトを停止させる)に戻します。
  • `WScript.Echo`: `MsgBox` と似ていますが、こちらは実行結果をコマンドプロンプトやCscriptの出力ウィンドウに表示します。大量のログを出力したい場合に便利です。
  • オブジェクトの解放: スクリプトの最後に `Set … = Nothing` と書くことで、使用したオブジェクトをメモリから解放します。これは、特に大きなファイルを扱ったり、長時間実行されるスクリプトでは、メモリ使用量を抑え、パフォーマンスを安定させるために重要です。

陥りやすいエラーとその対策

  • パスの誤り:
  • エラー: `SOURCE_FOLDER` や `DEST_BASE_FOLDER` のパスが間違っていると、「フォルダが見つかりません」というエラーになります。
  • 対策: パスは正確に、ダブルクォーテーションで囲み、末尾に `\` を付けずに指定します(`BuildPath` が処理してくれます)。コピー&ペーストする際は、パスが途中で切れていないか、不要な文字が入っていないか注意しましょう。
  • ファイル名の重複:
  • エラー: 移動先に既に同じ名前のファイルが存在する場合、デフォルトではエラーが発生して移動できません。
  • 対策: 上記スクリプトでは、`objFSO.FileExists(strFinalFilePath)` で移動先にファイルが存在するかチェックし、存在する場合はスキップするようにしています。もし上書きしたい場合は、このチェック部分を削除し、`On Error Resume Next` の部分でエラーを捕捉して処理することも可能ですが、データ損失のリスクが伴います。
  • 権限の問題:
  • エラー: ファイルを移動しようとしているフォルダへの書き込み権限がない場合、エラーが発生します。
  • 対策: スクリプトを実行するユーザーに、ソースフォルダおよび宛先フォルダへの適切な権限があることを確認してください。
  • 拡張子の小文字/大文字:
  • エラー: 拡張子の比較で大文字・小文字の違いにより、正しく振り分けられないことがあります。
  • 対策: `LCase()` 関数で統一して比較することで、この問題を回避しています。

まとめ:VBScriptで「自動化」の扉を開こう!

いかがでしたか?`GetExtensionName` と `GetBaseName` を使うことで、ファイルパスの解析が驚くほど簡単になることがお分かりいただけたかと思います。

今回作成したファイル整理スクリプトは、VBScriptの「ファイル操作」という、非常に実用的な分野への第一歩です。このスクリプトをベースに、

  • 特定の拡張子を削除する
  • ファイル名に連番を付ける
  • ファイル作成日や更新日によってフォルダ分けする

など、さらに高度な自動化へと発展させていくことも可能です。

「マクロの記録」だけでは限界を感じていた皆さん、ぜひこの自動整理スクリプトを試してみてください。あなたのPC作業が、きっともっと快適で効率的になるはずです。

VBScriptの世界は奥深く、まだまだたくさんの便利な機能があります。これからも皆さんと一緒に、その魅力を探求していきたいと思います。

では、また次回の記事でお会いしましょう!Happy scripting!

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