【AutoIt】フォルダー整理を効率化!サブフォルダーの中身も全部まとめて一箇所へ

特定のプロジェクトフォルダーの中に、さらに「資料」「画像」「議事録」といったサブフォルダーが散在していると、中のファイルを一覧するのが大変です。

今回は、AutoIt を使って指定した1つのフォルダーとその中にある全てのフォルダーから、ファイルだけを別のフォルダーに一括でコピーするスクリプトを紹介します。

目次

実行するスクリプトの概要

このスクリプトは、「コピー元フォルダー」と「集約先フォルダー」を順番に選択します。

実行すると、コピー元フォルダーとその中にある全てのサブフォルダーからファイルを探し出し、集約先フォルダーに全てコピーします。

階層を無視してファイルだけが 1つの場所に集まるので、中身の確認や整理が非常に楽になります。

サンプルコード

#include <File.au3>
#include <MsgBoxConstants.au3>
; ### メイン処理 ###
; 1. 元のフォルダーを選択してもらう
Local $sSourceFolder = FileSelectFolder("【1】中身をコピーしたいフォルダーを選択してください。", "")
If @error Then Exit
; 2. 集約先のフォルダーを選択してもらう
Local $sDestinationFolder = FileSelectFolder("【2】ファイルをまとめる先のフォルダーを選択してください。", "")
If @error Then Exit
; 3. フォルダー内のファイルリストを再帰的に取得する
Local $aFileList = _FileListToArrayRec($sSourceFolder, "*", $FLTAR_FILES, $FLTAR_RECUR)
If @error Then
    MsgBox($MB_ICONINFORMATION, "情報", "コピー元のフォルダーにファイルが見つかりませんでした。")
    Exit
EndIf
; 4. コピーしたファイル数をカウントする変数
Local $iCopiedFileCount = 0
; 5. Forループで、見つかったファイルを1つずつコピーする
For $i = 1 To $aFileList[0]
    Local $sSourceFilePath = $sSourceFolder & "\" & $aFileList[$i]
    ; ファイル名だけを取得
    Local $sFileName = StringMid($sSourceFilePath, StringInStr($sSourceFilePath, "\", 0, -1) + 1)
    ; コピー先のパスを生成
    Local $sDestFilePath = $sDestinationFolder & "\" & $sFileName
;~ MsgBox(0,$sSourceFilePath,$sDestFilePath)
    ; ファイルをコピーする (上書きしない場合は第3引数を0にする)
    FileCopy($sSourceFilePath, $sDestFilePath, 1) ; 1 = 上書きする
    $iCopiedFileCount += 1
Next
MsgBox($MB_OK, "完了", $iCopiedFileCount & "個のファイルを" & @CRLF & $sDestinationFolder & @CRLF & "にまとめました。")

コードの詳しい解説

_FileListToArrayRec でサブフォルダーも検索

このスクリプトの心臓部が_FileListToArrayRec関数です。Recは Recursive(再帰的)を意味し、指定したフォルダーだけでなく、その中にある全てのサブフォルダーの奥深くまでファイルを検索し、リストとして返してくれます。

これにより、フォルダー階層を意識することなく、全てのファイルを取得できます。

もしも特定の拡張子、例えば「.txt」(テキストファイル)を指定したいという場合は、Local $aFileList = _FileListToArrayRec($sSourceFolder, "*"の部分をLocal $aFileList = _FileListToArrayRec($sSourceFolder, "*.txt"に変更してください。

StringMid($sSourceFilePath, StringInStr($sSourceFilePath, “\”, 0, -1) + 1)

この一行は、2つの関数を組み合わせています。

  1. StringInStr($sSourceFilePath, "\", 0, -1)
    • $sSourceFilePath(例: "C:\Users\Taro\Desktop\Source_A\file1.txt")の中から、最後の「\」が何文字目にあるかを探します。最後の-1が「右側から検索する」という意味になります。
  2. StringMid($sSourceFilePath, ... + 1)
    • StringMidは、文字列の途中から一部分を抜き出す関数です。
    • 「最後の\が見つかった位置 + 1」の場所から、文字列の最後までを抜き出します。これにより、"file1.txt"の部分だけを正確に取得できます。

FileCopy と上書きオプション

FileCopy関数が、実際のファイルコピーを実行します。

  • $sSourceFilePath: コピー元のファイルのフルパス
  • $sDestFilePath: コピー先のファイルのフルパス
  • 1: 3番目の引数は上書きオプションです。「1」に設定すると、もし集約先フォルダーに同じ名前のファイルが存在した場合、新しいファイルで上書きします。上書きしたくない場合は「0」に変更してください。この場合、同名ファイルはコピーされずにスキップされます。

まとめ

このスクリプトは、階層的に整理されたフォルダーの中身を、一時的にフラットな状態にして確認したい場合に非常に役立ちます。

もし複数のフォルダーをまとめたい場合は、お手数ですがこのスクリプトをフォルダーの数だけ繰り返して実行してください。

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次