デジカメで撮った写真やダウンロードしたファイルなど、名前がバラバラなファイルを「file_001.jpg」「file_002.jpg」のように、一括で綺麗な連番にリネームしたいと思ったことはありませんか?
今回は、AutoIt を使って、指定したフォルダー内の特定の拡張子を持つファイルすべてを、一括で連番付きのファイル名に変更する方法を紹介します。
スクリプトの概要
このスクリプトを実行すると、まずリネームしたいファイルがあるフォルダーを選択するダイアログが表示されます。
フォルダーを選択すると、その中にある指定された拡張子のファイル(例:「.jpg」)が、指定した接頭辞(前につける文字)と 3桁の連番(001, 002, …)を持つ新しいファイル名に一括で変更されます。
サンプルコード
#include <File.au3>
#include <MsgBoxConstants.au3>
; ### 設定項目 ###
; 変更したいファイルの拡張子を指定します。
Local $sFileExtension = ".jpg"
; 新しいファイル名の接頭辞(前につける文字)を指定します。
Local $sPrefix = "photo_"
; 連番の開始番号を指定します。
Local $iCounter = 1
; ### メイン処理 ###
; ユーザーにフォルダーを選択してもらうダイアログを表示します。
Local $sFolderPath = FileSelectFolder("連番リネームしたいファイルがあるフォルダーを選択してください。", "")
; もしユーザーがキャンセルボタンを押したら、スクリプトを終了します。
If @error Then Exit
; 選択されたフォルダー内の、指定した拡張子のファイルリストを取得します。
Local $aFileList = _FileListToArray($sFolderPath, "*" & $sFileExtension)
; ファイルが見つからなかった場合のエラー処理です。
If @error Then
MsgBox($MB_ICONINFORMATION, "情報", "指定されたフォルダーに" & $sFileExtension & "ファイルは見つかりませんでした。")
Exit
EndIf
; Forループを使って、ファイルリストの各ファイルを順番に処理します。
For $i = 1 To $aFileList[0]
; 現在のファイルパスを取得します。
Local $sCurrentFilePath = $sFolderPath & "\" & $aFileList[$i]
; 新しいファイル名を生成します。StringFormatで3桁のゼロ埋めを実現します。
Local $sNewFileName = $sPrefix & StringFormat("%03d", $iCounter) & $sFileExtension
; 新しいファイルパスを生成します。
Local $sNewFilePath = $sFolderPath & "\" & $sNewFileName
; FileMove関数でファイル名を変更します。(リネームは移動と同じ扱いです)
FileMove($sCurrentFilePath, $sNewFilePath)
; 次のファイルのために、カウンターを1増やします。
$iCounter += 1
Next
; 処理が完了したことをメッセージで伝えます。
MsgBox($MB_OK, "完了", $aFileList[0] & "個のファイルの連番リネームが完了しました。")
コードの詳しい解説
#include から始まる行
File.au3は、_FileListToArrayのようなファイル操作に便利な関数群を読み込むために必要です。
MsgBoxConstants.au3は、メッセージボックス用の定数を読み込むためのおまじないです。
設定項目
Local $sFileExtension = ".jpg"
Local $sPrefix = "photo_"
Local $iCounter = 1
この3つの変数を書き換えることで、スクリプトの動作を自由に変更できます。
$sFileExtension: リネーム対象の拡張子を_ドット(.)を含めて_指定します。.pngや.txtなどに変更できます。$sPrefix: 新しいファイル名の先頭に付く文字です。image-やdocument_など、好きな文字列に変更できます。$iCounter: 連番をいくつから始めるかを指定します。通常は「1」で問題ありません。
FileSelectFolder(…)
ユーザーにフォルダーを選択させるためのダイアログを表示する関数です。戻り値として、選択されたフォルダーのフルパスが変数$sFolderPathに格納されます。もしキャンセルされると@errorマクロが「1」になるため、If @error Then Exitという行でスクリプトを終了させています。
_FileListToArray(…)
指定したフォルダー($sFolderPath)内にある、指定したパターン("*.jpg"など)に一致するファイルのリストを配列として取得する、非常に便利な関数です。
配列とは、複数のデータ(この場合はファイル名)を格納できる大きな箱のようなものです。取得したリストは$aFileListという変数に格納されます。
For $i = 1 To $aFileList[0] … Next
これは For ループと呼ばれる構文で、配列の中身を一つずつ順番に処理するためのお決まりの書き方です。
$aFileList[0]には、見つかったファイルの総数が格納されているため、1番目から最後のファイルまで処理が繰り返されます。
StringFormat(“%03d”, $iCounter)
この部分が、連番を「1, 2, 3…」ではなく「001, 002, 003…」のように桁数を揃える(ゼロ埋めする)ための重要なテクニックです。
StringFormatは、指定した書式で文字列を整形する関数です。"%03d"は「3桁の整数で、足りない部分は 0で埋める」という意味の書式指定子です。
もし 4桁にしたければ"%04d"とします。
FileMove($sCurrentFilePath, $sNewFilePath)
FileMove 関数は、ファイルを移動させるための関数ですが、同じフォルダー内で移動先を指定するとファイル名変更(リネーム)として機能します。
ここでは、元のファイルパス($sCurrentFilePath)から、先ほど生成した新しいファイルパス($sNewFilePath)へファイルを「移動」させることで、結果的にリネームを実現しています。
まとめ
このスクリプトを使えば、手作業で一つ一つ名前を変更する手間から解放されます。設定項目を少し変更するだけで、様々な種類のファイルに応用が可能です。
ぜひ、あなたの PC に眠っているバラバラな名前のファイルたちを、このスクリプトで綺麗に整理整頓してみてください。

コメント