【Windowsバッチ】ドラッグ&ドロップだけでファイル一覧出力

快速ワーク
スポンサーリンク

ファイルのみをリスト出力したい場面ってありませんか?

あのファイルどこに置いたっけな? ファイル名を整理しないとやばいな・・・など

そんな人向けに手っ取り早く、ドラッグ&ドロップするだけで簡単にCSVファイルを出力するWindowsバッチのスクリプトを作成してみました。

そんなソフトはいろいろあるかもしれませんが、簡単にリスト出力さえできればいい、という方はぜひコピって使ってみてください。


スポンサーリンク

Windowsバッチツールの操作イメージ

一括で複数のフォルダやファイルをドラッグ&ドロップし、ファイルフルパス・ファイル名・更新日時・サイズなどのファイルのみ(フォルダは含まない)のリストをCSVファイル出力して、Excelで表示するイメージ映像です。


Windowsバッチツールの主な仕様

細かい処理はコメントで補足してるので、ザックリとした仕様を箇条書きで記載します。

  • 複数のフォルダやファイルをドラッグ&ドロップして起動
  • ダブルクリック不可チェック実施
  • フォルダorファイルの属性チェックを実施
  • ファイル情報として絶対パス、ファイル名、更新日時、サイズを取得
  • batファイルを配置している場所にファイルのみリストをCSVファイル出力(カンマ区切り)



Windowsバッチツールのソースコード

下記のソースを全てコピー、1ファイルにまとめて保存してください。

Windwosバッチは簡単な処理であればいろいろ融通が効くと思うので、目的に合っていない場合は適当にカスタマイズしてみてください。

@echo off

rem #################################################################################################
rem  (ファイル名)
rem  file_list_out.bat
rem  (処理概要)
rem  フォルダやファイルをドラッグ&ドロップしたファイルのみの情報をCSV出力
rem  (注意事項)
rem ・対象パス配下にあるファイル数があまりに多い場合は非常に時間がかかる。
rem ・ネットワーク上のフォルダやファイルを指定する場合はネットワークドライブに割り当てる必要がある。
rem #################################################################################################


rem ##############
rem  遅延環境変数
rem ##############
setlocal enabledelayedexpansion


rem ##########
rem  初期処理
rem ##########
rem -----引数-----
rem ドラッグ&ドロップ
set INPUT_PATH=%~1

rem -----引数チェック-----
rem クリック起動チェック(ドラッグ&ドロップのみOK、ダブルクリック起動はNG)
if "%INPUT_PATH%"=="" echo ドラッグ&ドロップしてください(複数可)& timeout 3& exit

rem -----設定-----
rem 自フォルダ
set DIR_HOME=%~dp0

rem 日付・時刻・秒
call :YYYYMMDDHHMMSS_GET

rem ファイル出力対象ファイル
set FILEOUT_TARGET_FILE=%DIR_HOME%!W_YYYYMMDDHHMMSS!_FILE_LIST.csv


rem ############
rem  メイン処理  
rem ############
rem -----タイトル出力-----
echo ファイルフルパス,ファイル名,更新日時,サイズ>> "!FILEOUT_TARGET_FILE!"
rem -----ドラッグ&ドロップした複数のフォルダやファイル分ループ-----
for %%F in (%*) do (

  rem 対象パス取得
  set TARGET_PATH=%%~F

  rem 属性チェック
  call :ATTRIBUTE_CHK "!TARGET_PATH!"
  if "!W_FOLDER_FILE_KBN!"=="1" (
  rem ファイルの場合

    rem ファイル名抽出
    call :PATH_UNDER_GET "!TARGET_PATH!"& set FILE_NM=!W_UNDER_NM!

    rem リスト出力
    call :FILE_TIMESTAMP_SIZE_GET "!TARGET_PATH!"
    echo !TARGET_PATH!,!FILE_NM!,!W_FILE_TIMESTAMP!,!W_FILE_SIZE!>> "!FILEOUT_TARGET_FILE!"

  ) else (
  rem フォルダの場合

    rem 1フォルダ内のフォルダやファイル分ループ
    for /F "DELIMS=" %%A in ('dir /b /s "!TARGET_PATH!"') do (

      rem 絶対パス
      set FULL_PATH=%%A

      rem 属性チェック
      call :ATTRIBUTE_CHK "!FULL_PATH!"
      rem ファイルの場合のみ
      if "!W_FOLDER_FILE_KBN!"=="1" (

        rem ファイル名抽出
        call :PATH_UNDER_GET "!FULL_PATH!"& set FILE_NM=!W_UNDER_NM!

        rem リスト出力
        call :FILE_TIMESTAMP_SIZE_GET "!FULL_PATH!"
        echo !FULL_PATH!,!FILE_NM!,!W_FILE_TIMESTAMP!,!W_FILE_SIZE!>> "!FILEOUT_TARGET_FILE!"

      )

    )

  )

)
echo.& echo ドラッグ&ドロップしたフォルダ配下のファイルリスト「!FILEOUT_TARGET_FILE!」を出力しました。

rem notepad !FILEOUT_TARGET_FILE!

exit /B


rem ###########################################################
rem  (共通部品)日付・時間・秒をYYYYMMDDHHMMSS形式で取得
rem  ・半角スペースを0に置換
rem  「 9:39:50.87」→「09:39:50.87」
rem    ^
rem  ・日付・時間を抽出
rem    0123456789                    01234567890
rem  「2019/03/03」→「20190303」+「09:39:50.87」→「093950」
rem    ^^^^ ^^ ^^                    ^^ ^^ ^^
rem ###########################################################
:YYYYMMDDHHMMSS_GET
set W_TIME=!time: =0!
set W_YYYYMMDDHHMMSS=!Date:~0,4!!Date:~5,2!!Date:~8,2!!W_TIME:~0,2!!W_TIME:~3,2!!W_TIME:~6,2!
exit /B


rem ############################################
rem  (共通部品)ファイルの更新日時とサイズ取得
rem  ・ファイルの日付/時刻に展開
rem  例)2019/03/03 09:54
rem  ・ファイルのサイズに展開
rem  例)1936
rem ############################################
:FILE_TIMESTAMP_SIZE_GET
set W_FILE_TIMESTAMP=%~t1
set W_FILE_SIZE=%~z1
exit /B


rem ####################################################
rem  (共通部品)パス再下層取得
rem  ・"\"を含むフルパスから、
rem    最下層のフォルダまたはファイルのみになるまで
rem    文字列編集して再帰的ループ(~\を削っていく)
rem  例)「C:\Windows\Temp」         →「Temp」取得
rem      「C:\Windows\Temp\temp.txt」→「temp.txt」取得
rem ####################################################
:PATH_UNDER_GET
set W_UNDER_NM=%~1
if "%W_UNDER_NM%"=="" exit /B
if "%W_UNDER_NM%"=="%W_UNDER_NM:*\=%" exit /B
set W_UNDER_NM="%W_UNDER_NM:*\=%"
call :PATH_UNDER_GET %W_UNDER_NM%
exit /B


rem ###############################################
rem  (共通部品)属性チェック
rem  ・フォルダかファイルかをチェック
rem  ・ファイルファイル区分(0:フォルダ,1:ファイル)
rem ###############################################
:ATTRIBUTE_CHK
set W_ATTR=%~a1
if %W_ATTR:~0,1%==d (set W_FOLDER_FILE_KBN=0)
if %W_ATTR:~0,1%==- (set W_FOLDER_FILE_KBN=1)
exit /B

最後に

ファイルリスト出力の手段としては、Excelのvbaやフリーソフトなどでいくらでも見つかるとは思いますが、WIndowsバッチでもこんなことができるよ、というのをお伝えするために紹介させていただきました。

Windowsバッチをちょっと使いこなせば、例えば1時間かかっていた作業を1分でこなすことができるようになる可能性があります。

Windows環境であれば下準備不要で今すぐに始められるので、興味のある方はまずは少し触ってみてください。


コメント

//▼2023/04/08追加 //https://lovagelab.com/posts/3406/ //▲2023/04/08追加