概要
batを実行したら、配置フォルダ以下の階層を参照して、こういうやつ↓を出力するbatファイルの作り方。
folder/
├── subfolder1/
│ ├── test.md
│ └── test2.txt
└── subfolder2/
├── sample.exe
└── something.dll
コード
bat名は任意で付与してよいです。bat自身の名称は出力しないようになっています。
@echo off
setlocal enabledelayedexpansion
rem バッチファイルの名前を取得
set "batch_name=%~nx0"
rem ルートフォルダ名を取得
for %%I in ("%CD%") do set "root_folder_name=%%~nxI"
echo ディレクトリ構造: %CD%
echo 現在のフォルダ名: %root_folder_name%
echo 作成日時: %date% %time%
echo.
rem ルートディレクトリ名を表示
echo %root_folder_name%/
rem インデントの初期化
set "indent= "
call :treeProcess
echo.
echo 処理が完了しました。何かキーを押すと終了します。
pause >nul
goto :eof
rem ディレクトリ構造を再帰的に処理する関数
:treeProcess
set "last="
rem 最後のフォルダ or ファイルに当たるまでlast変数を上書きし続けて、最後のフォルダ or ファイルを取得
rem lastに値をセットするためだけのforループ
rem カレントディレクトリの階層のみ対象。サブディレクトリの中身までは、この時点では見ない
for /F "tokens=*" %%G in ('dir /B /A ^| findstr /v /i /x "%batch_name%"') do set "last=%%G"
rem カレントディレクトリの全フォルダ、ファイルに対して処理を行うforループ
for /F "tokens=*" %%G in ('dir /B /A ^| findstr /v /i /x "%batch_name%"') do (
rem 今回ループで処理しているものが、最後のフォルダ/ファイルに当たるなら"└──"、それ以外は"├──"のプレフィックスを付与
if "%%G"=="%last%" (
set "prefix=└── "
set "childIndent= "
) else (
set "prefix=├── "
rem 上の階層を表現するための縦線記号つきインデント
set "childIndent=│ "
)
rem 今回ループで処理しているものが、フォルダであるか判定(existsで、配下に何かあればフォルダと判定)
if exist "%%G\*" (
rem フォルダなら、プレフィックスとフォルダ名、スラッシュ記号を表示
echo !indent!!prefix!%%G/
rem フォルダ内に移動して、再帰的に同じ処理を行う
pushd "%%G"
rem インデントを長くして深い階層を表現
set "indent=!indent!!childIndent!"
rem 再帰処理
call :treeProcess
rem フォルダ内の処理が終わったら、元の階層に戻る
popd
rem インデントを短くする
set "indent=!indent:~0,-4!"
) else (
rem フォルダでないなら、素直にプレフィックスとファイル名を表示
echo !indent!!prefix!%%G
)
)
exit /b
:eof
endlocal
実行結果例
bat実行時のコマンドプロンプトに、以下表示されます。もちろん手を加えれば別ファイルに書き込むことも可能なはず。
ディレクトリ構造: D:\dev\test\GUI_Tool\Tool\database
現在のフォルダ名: database
作成日時: 2024/12/18 6:14:37.28
database/
├── export_tools/
│ ├── conf/
│ │ └── Env.bat
│ └── Export.bat
├── insert_tools/
│ ├── conf/
│ │ └── Env.bat
│ ├── Insert.bat
│ └── sql/
│ ├── create_index/
│ │ ├── index1.sql
│ │ └── index2.sql
│ └── drop_create_table/
│ ├── table1.sql
│ └── table2.sql
└── docs/
└── document.md