Windowsにて特定のディレクトリ配下のツリービューをテキストファイル形式で出力する方法

ネット&デジタル

ある特定のディレクトリ(フォルダ)配下にあるファイルやディレクトリの構造をテキスト形式で表現することを

  • ツリービュー(Tree View)
  • ディレクトリツリー(Directory Tree)
  • ファイルツリー(File Tree)
  • ツリーストラクチャ(Tree Structure)

などと呼びます。英語圏では、

  • ASCII Tree
  • Text-based Directory Tree
  • ASCII Folder Structure
  • Box Drawing Tree Diagram

などと呼ぶそうです。
↓こんな感じですね。

ツリービューの一例

こうしたツリービュー形式のテキストファイルで出力する方法をChatGPT 4oに相談して教えてもらいましたので、共有します。想定する環境はWindows11です。PowerShellが使えればWin11に限りません。

シンプルなスクリプト

$folder = "対象ディレクトリのフルパス"
tree $folder /F /A > "$folder\tree.txt"

PowerShellを起動し、上記のコードをコピペで実行するだけです。フルパス部分は適宜書き換えてからコピペでお使いください。たったこれだけで、対象ディレクトリにツリービューのテキストファイルが生成されます。

なお、「/A」オプションは全てアスキー文字だけで表現する指示。このオプションを外すと、よく見かける枝付き文字の表現になりますので、そちらのほうがなじみがあるかもしれません。

インデントではなく枝付き文字で表現する方法

前述の方法だとシンプルで良いのですが、これだとディレクトリ配下のファイル群はインデントで表示されます。インデントではなく完全に全て枝付き文字で表現する方法について、今度はClaude 3.7 Sonnetに相談しながらスクリプトを書いてもらいました。

param (
    [Parameter(Mandatory=$true)]
    [string]$TargetPath,
    
    [Parameter(Mandatory=$false)]
    [string]$OutputFile = "DirectoryTree.txt"
)

# 指定されたパスが存在するか確認
if (-not (Test-Path $TargetPath)) {
    Write-Error "指定されたパスが存在しません: $TargetPath"
    exit 1
}

# パスを絶対パスに変換
$TargetPath = Resolve-Path $TargetPath

# 出力ファイルのパスを対象ディレクトリ自体に設定(ディレクトリの中に保存)
$OutputFilePath = Join-Path $TargetPath $OutputFile

# 出力をファイルに書き込むための準備
$output = New-Object System.Collections.Generic.List[string]
$output.Add($TargetPath)
$output.Add("")

# 再帰的にディレクトリ構造を取得する関数
function Get-TreeStructure {
    param (
        [string]$Path,
        [string[]]$Prefix = @()
    )

    # 現在のディレクトリ内のすべてのアイテムを取得
    $items = Get-ChildItem -Path $Path -ErrorAction SilentlyContinue | 
             Sort-Object -Property @{Expression = {$_.PSIsContainer}; Descending = $true}, Name

    # 各アイテムを処理
    for ($i = 0; $i -lt $items.Count; $i++) {
        $item = $items[$i]
        $isLast = ($i -eq $items.Count - 1)
        
        # 現在の行のプレフィックスを作成
        $currentLine = ""
        foreach ($p in $Prefix) {
            $currentLine += $p
        }
        
        # 現在のアイテムの接続符号を追加
        if ($isLast) {
            $currentLine += "└─ "
        } else {
            $currentLine += "├─ "
        }
        
        # アイテム名を追加して出力
        $output.Add("$currentLine$($item.Name)")
        
        # ディレクトリならその内容も処理
        if ($item.PSIsContainer) {
            # 次のレベルのプレフィックスを準備
            $newPrefix = $Prefix.Clone()
            if ($isLast) {
                $newPrefix += "    "  # 最後のアイテムなら空白
            } else {
                $newPrefix += "│   "  # 最後でなければ縦線
            }
            
            # 再帰的に処理
            Get-TreeStructure -Path $item.FullName -Prefix $newPrefix
        }
    }
}

# ツリー構造の生成を開始
Get-TreeStructure -Path $TargetPath

# 結果をファイルに保存(UTF-8エンコーディング)
$output | Out-File -FilePath $OutputFilePath -Encoding utf8

Write-Host "ディレクトリツリーが保存されました: $OutputFilePath"

上記内容を Get-DirectoryTree.ps1 という名前でファイル保存する。保存するエンコードは UTF-8(BOMあり)で、改行コードは LF にすること。UTF-8NはBOM無しなのでエラーになります。

使い方

上記スクリプトの使い方は、

  1. PowerShellを起動
  2. CDコマンドで上記スクリプト・ファイルを置いてあるディレクトリに移動
  3. 以下の命令をコピペ
.\Get-DirectoryTree.ps1 -TargetPath "対象フォルダのフルパス" -OutputFile "tree.txt"

もしも実行ポリシーのセキュリティ・エラーが発生した場合は、

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

上記を実行して一時的に実行ポリシーを変更する。

これで、よく見かける枝付きのツリービューが保存されたテキストファイルが出力されるようになります。

-OutputFile オプションは明示的に出力ファイル名を指定したいときに使ってください。このオプションがない場合は、デフォルトのファイル名 DirectoryTree.txt で対象ディクレトリ内に出力されます。

コメント

タイトルとURLをコピーしました