0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【bat】配置したフォルダ以下のディレクトリ構成を文字列で表現する

Posted at

概要

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?