ファイル管理支援ツール（ファイル名の日付でグルーピングして表示するバッチ）

# 正式なファイルを提出する時に、提出した時点のファイルは残したいですよね。
windowsのファイルシステムって、機能が貧弱なのですが、ファイル名の工夫でその保管方法を改善しました。

# ファイルを提出日の日付のフォルダで整理してませんか？

フォルダ20240405
---XX殿向けXXシステム概要提案.xlsx

フォルダ20240618
---XX殿向けXXシステム仕様書.xlsx
---XX殿向けXXシステムマニュアル.xlsx

フォルダ20240918
---XX殿向けXXシステム仕様書_v2.xlsx
---XX殿向けXXシステムマニュアル_v2.xlsx

こんな感じ。

これをやると、後で見ようとしたときに、提出日が分からないファイルは、どのフォルダに入れたのか探すのがめっちゃ大変です。また、引継ぎをするにも、一覧性が低く、全体把握が難しい。
そもそも、どれが探しているドキュメントの最終提出物なのかもわからない。
しかも、ファイル検索も使い勝手が悪く、あまり当てにできない。

# ファイル名の頭の部分に提出日を入れて整理してみた。
そこで、日別のフォルダ分けをやめて、ファイル名の頭の部分に日付を入れることで、それを使ってソート表示したりしてました。
これで、一覧性は飛躍的に向上します。
全てのファイルが、提出日順に表示できるので、経緯は分かりやすくなる。

### しかーし！

日付別のフォルダよりは、ましになりますが、これって、同一ファイルの更新をしたときに、他のファイルが間に挟まって、バラバラになってしまい、相変わらず、最新版の管理としては分かり難いままです。

20240405XX殿向けXXシステム概要提案.xlsx
20240615XX殿向けXXシステム仕様書.xlsx
20240615XX殿向けXXシステムマニュアル.xlsx
20240918XX殿向けXXシステム仕様書_v2.xlsx
20240918XX殿向けXXシステムマニュアル_v2.xlsx

こんな感じ。

# そこで、ファイル名の後ろに日付を入れることにしました。
こうすれば、
XX殿向けXXシステム概要提案_20240405.xlsx
XX殿向けXXシステムマニュアル_20240618.xlsx
XX殿向けXXシステムマニュアル_v2_20240918.xlsx
XX殿向けXXシステム仕様書_20240618.xlsx
XX殿向けXXシステム仕様書_v2_20240918.xlsx
みたいな感じで、同じ用途のファイルが続けて表示されるので、どれが最新版かもすぐわかる！

ファイルが種類別に整理出来ていて、それぞれの種類が提出順に並ぶ。

予は満足じゃ！(^^♪


# 問題は解決したが
・一覧性の向上により、ファイルが見つけやすく、引継ぎもしやすい。
・最新ファイルをパッと見て分かる。
というフォルダ別保存での問題点は、これによって解決しました。

しかし、人間は欲深いもので
「提出日毎にどのファイルを同時に提出したのか？」
はフォルダ別の方が分かりやすかった。
という声もあります。

# そこで登場するのは「ファイル名の日付でグルーピングして表示するバッチ」
です。

これがあれば、
「提出日毎にどのファイルを同時に提出したのか？」
という、滅多にないニーズに応える事が出来ます。

単純なバッチなので、解説は特にしませんが、使い方は、
「提出日毎にどのファイルを同時に提出したのか？」を解析したいフォルダをドラッグ＆ドロップでこのバッチに重ねてください。

フォルダは参照するだけなので、実害はありませんが、ファイル名の最後に日付をYYYYMMDDで入れておいてください。

また、バッチ中にある設定を変えれば、日付+固定長のバージョン番号も入れたい！というニーズにも対応します。

※2024/9/27少し修正しました。
また、既存のYYYYMMDDフォルダに分けて保存している構造を、後ろに_YYYYMMDDと変換するバッチも作成しましたので、それも掲載しておきます。

ちなみに、windowsキー+rで表示されたところに
shell:sendto
と打つと、ファイルやフォルダを右クリックしたときに「送る」で表示されるものが出てきます。
そこに、下記バッチのショートカットを入れて、ファイル名を
_ファルダ内の日付別表示
としておくと、見たいフォルダを右クリックして、送るから見やすくなるので、便利です。


```bat:datesort.bat
@echo off
setlocal enabledelayedexpansion

rem 以下の2つの変数は、用途に合わせて変更ください。

rem １．バージョン表記の設定
rem ファイル名の最後を日付＋固定長バージョンとしたい場合は、バージョンの固定長をセットください。
rem ファイル名にバージョンを含まない場合は、0としてください。
set version_length=0

rem ２．ワークファイルの削除
rem ワークファイルを削除したい場合は、以下をYESにしてください。
set work_file_delete=NO

rem 以下は基本的に修正しないでください。

rem ドラッグ＆ドロップされたフォルダを取得
set "folderPath=%~1"

rem 各変数初期設定
set file_count=0
set illegal_date=NO
set correct_date=00000101
set /A date_work_lengh=8+%version_length%
set "tempFile=%temp%\temp_grouping.txt"

rem フォルダがドラッグ＆ドロップされたかチェック
if "%folderPath%"=="" (
    if %version_length%==0 (
    echo このバッチはファイル名の最後をYYYYMMDDとして、日付別にグルーピングして表示します。
    echo.
    echo ※ファイル名の最後がYYYYMMDDでない場合は、日付を%correct_date%として処理します。
    echo.
    ) else (
    echo このバッチはファイル名の最後をYYYYMMDD+%version_length%桁のバージョン表記として、日付別にグルーピングして表示します。
    echo.
    echo ※ファイル名の最後がYYYYMMDD+%version_length%桁のバージョン表記でない場合は、日付を%correct_date%として処理します。
    echo.
    )
    echo フォルダをこのバッチファイルにドラッグ＆ドロップしてください。
    echo.
    pause
    exit /b
)

rem 一時ファイルが残っていたら削除
if exist %tempFile% del %tempFile%

rem フォルダ内のファイルをループ
for /f "delims=" %%F in ('dir /b "%folderPath%"') do (
    set /A file_count=!file_count!+1
    set "fileName=%%~nF"
    rem ファイル名の後ろ8文字+バージョン分を抽出
    set "datePart=!fileName:~-%date_work_lengh%!"
    rem 日付部分のみ取り出し
    set "datePart=!datePart:~0,8!"
    rem ファイル名の最後の8文字が数字でないものは、%correct_date%として処理する。
    for /F "delims=0123456789" %%A in ("!datePart!") do (
        set illegal_date=YES
        set "datePart=%correct_date%"
    )
    rem 一時ファイルに書き込み
    echo !datePart! %%~nxF >> %tempFile%
)

rem グルーピングして表示
set "prevDate="
for /f "tokens=1,* delims= " %%A in ('sort %tempFile%') do (
    if not "!prevDate!"=="%%A" (
        REM 部分文字列を使って年月日を分割
        set date=%%A
        set "year=!date:~0,4!"
        set "month=!date:~4,2!"
        set "day=!date:~6,2!"
        echo.
        echo [日付: !year!/!month!/!day!]
        set "prevDate=%%A"
    )
    echo     %%B
)

echo ====================================================================================
echo.
echo.
echo.
echo.
rem echo [%folderPath%]フォルダーには、[%file_count%]個のファイルが見つかりました。
rem echo [%file_count%]個のファイルが見つかりました。
echo.

if "%work_file_delete%"=="NO" echo 上記一覧は[%tempFile%]に残しています。
rem if %illegal_date%==YES echo ファイル名のYYYYMMDDが規則通りでないファイルが見つかりました。このファイルの日付は%correct_date%としました。
echo.

rem 一時ファイルを削除
if not "%work_file_delete%"=="NO" del %tempFile%

endlocal
pause

:end

```

```bat:save_with_date.bat
@echo off
setlocal enabledelayedexpansion

REM 元フォルダと移動先フォルダを指定してください
set "source_Folder=%~1
set "destination_Folder=%source_Folder%_converted"

REM destination_Folderを作成
if not exist "%destination_Folder%" mkdir "%destination_Folder%"

REM source_Folder内のサブフォルダをループ処理
for /d %%D in ("%source_Folder%\*") do (
    REM フォルダ名を取得
    set "folder_name=%%~nxD"

    REM フォルダ名の最初の8文字を取得
    set "date_prefix=!folder_name:~0,8!"

    REM サブフォルダ内のファイルやフォルダをループ処理
    for /f "delims=" %%F in ('dir /b "%%D"') do (
        rem echo "％F"="%F"
        rem echo "％％F"="%%F"
        
        if exist "%%D\%%F\" (
        REM フォルダ
        set "file_name=%%~nxF"
        set "new_name=!file_name!_!date_prefix!"
        
        REM リネームしてdestination_Folderに移動
        rem echo    move "%%F" "%destination_Folder%\!new_name!"
        robocopy "%%D\%%F" "%destination_Folder%\!new_name!" /E
        ) else (
        REM ファイル
        set "file_name_base=%%~nF"
        set "file_name_ext=%%~xF"
        rem %~nx0	ベースネーム + 拡張子	sample.bat
        rem %~n0	ベースネーム	sample
        rem %~x0	拡張子	.bat
        REM 新しいファイル名を設定
        set "new_name=!file_name_base!_!date_prefix!!file_name_ext!"
        
        REM リネームしてdestination_Folderに移動
        rem echo    move "%%F" "%destination_Folder%\!new_name!"
        copy "%%D\%%F" "%destination_Folder%\!new_name!"
        )
    )
)

echo 処理が完了しました。
pause

:end
```