Windowsのtreeコマンドで、指定したフォルダー以下の構成図を作れます。
READMEへ貼る図はtree、Excelなどで並べ替えるファイル一覧はdirやCSVに分けて出力します。
対象を限定して構成図を表示する
ZIPは新しい空のフォルダーへ展開し、元データや既存の出力を含む場所へ重ねて展開しないでください。
ZIPのprojectにはREADME.mdと、日本語 資料/名前 ! & [x].txtが入っています。
コマンドプロンプトでZIPを展開した場所を開き、次のコマンドを実行します。
tree "project" /f /a/fはファイル名も表示し、/aは枝の線を半角の文字で表示する指定です。
ドライブ全体を指定すると関係のないファイルも含まれるため、対象のプロジェクトフォルダーに絞ります。
日本語をUTF-8のテキストへ保存する
今回のWindows環境では、chcp 65001の後でもtreeのリダイレクト結果はUTF-8になりませんでした。
tree-export.ps1はWindowsのOEMコードページで出力を読み、UTF-8(BOM付き)で保存します。
PS1はWindows PowerShell 5.1で使用し、UTF-8(BOM付き)で保存します。
以下の起動例はそのプロセスだけにRemoteSignedを指定し、PC全体の実行ポリシーは変更しません。
ダウンロードしたPS1の署名エラーでは内容と出所を確認し、信頼できる対象ファイルだけプロパティからブロックを解除します。
組織のポリシーで止まる場合は管理者へ確認してください。
param([Parameter(Mandatory=$true)][string]$Source,
[Parameter(Mandatory=$true)][string]$Output)
$ErrorActionPreference = 'Stop'
$item = Get-Item -LiteralPath $Source
if (-not $item.PSIsContainer) { throw 'Source must be a folder' }
$root = $item.FullName.TrimEnd('\')
$out = [IO.Path]::GetFullPath($Output)
if ($out -eq $root -or $out.StartsWith($root + '\', [StringComparison]::OrdinalIgnoreCase)) { throw 'Output must be outside Source' }
if (Test-Path -LiteralPath $out) { throw 'Output already exists' }
# tree.com writes in the Windows OEM code page, irrespective of chcp 65001.
Add-Type -TypeDefinition 'public class CgmOem { [System.Runtime.InteropServices.DllImport("kernel32.dll")] public static extern uint GetOEMCP(); }'
$savedEncoding = [Console]::OutputEncoding
try {
[Console]::OutputEncoding = [Text.Encoding]::GetEncoding([int][CgmOem]::GetOEMCP())
$lines = @(& "$env:SystemRoot\System32\tree.com" $root /f /a)
if ($LASTEXITCODE -ne 0) { throw 'tree failed' }
} finally { [Console]::OutputEncoding = $savedEncoding }
$lines | Out-File -LiteralPath $out -Encoding UTF8 -NoClobber
ZIPのlists.batは構成図とファイル一覧をまとめて出力します。
@echo off
setlocal DisableDelayedExpansion
chcp 65001 >nul
pushd "%~dp0" || exit /b 1
if not exist "project\" exit /b 1
if exist "tree-list.txt" exit /b 1
if exist "file-list.txt" exit /b 1
powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File "%~dp0tree-export.ps1" -Source "%~dp0project" -Output "%~dp0tree-list.txt"
if errorlevel 1 exit /b 1
dir "project" /s /b /a-d /o:n > "file-list.txt"
if errorlevel 1 exit /b 1
popd
- 新しい練習フォルダーでlists.batを実行する
- tree-list.txtに日本語のファイル名と半角の枝が出ていることを確認する
- file-list.txtにファイルのフルパスが1行ずつ出ていることを確認する
出力はprojectの外に置くため、一覧そのものが対象へ混ざりません。
dirの/sは下位フォルダーも対象にし、/bは説明を省略し、/a-dはフォルダーを除外します。
tree-list.txtまたはfile-list.txtがある場合は停止し、既存の結果を上書きしません。
表計算で使うCSVとREADMEへの貼り付け
パス・名前・拡張子・バイト数を列に分ける場合は、ZIPのinventory.ps1を使います。
powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File ".\inventory.ps1" -Source ".\project" -Output ".\files.csv"files.csvはUTF-8(BOM付き)で、名前にカンマがある場合もCSVの引用符で列を保持します。
スクリプトの全文と画像サイズを加える例は、ファイル情報をCSVへ出す記事に掲載しています。
READMEへ構成図を貼る場合はtree-list.txtから対象フォルダー以下の行を選び、Markdownのコード枠で囲みます。
ボリューム情報や公開したくないフォルダー名は、共有する前に出力から取り除いてください。
旧記事のexTree.vbsは配布元を確認できないため案内を終了し、Windows標準のtreeとdirに更新しました。
失敗したときと戻し方
Source must be a folderでは対象の場所を確認し、Output already existsでは新しい出力名を指定します。
権限不足で出力できなかった場合は完成した一覧として使わず、読み取り可能な練習用フォルダーで手順を確認します。
元フォルダーは変更しないため、やり直すときは新しい出力ファイルへ書き出します。
2026年10月2日にWindows CMDとPowerShell 5.1で日本語のUTF-8保存、ファイルのみの一覧、出力ファイルの除外、再実行時の停止を確認しました。
Excelへの取り込み画面は今回の検証に含めていません。
仕様:Microsoft tree、dir。
関連するファイル操作とツール





