tree.ps1
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function Show-Tree {
    param(
        [string]$Path = ".",
        [int]$Depth = 3
    )

    $Root = Resolve-Path $Path

    function Walk {
        param(
            [string]$P,
            [int]$Level,
            [string]$Prefix
        )

        if ($Level -gt $Depth) { return }

        $Entries = Get-ChildItem $P | Sort-Object @{Expression = { $_.PSIsContainer }; Descending = $true }, Name
        $Count = $Entries.Count

        for ($i = 0; $i -lt $Count; $i++) {
            $Entry = $Entries[$i]
            $IsLast = ($i -eq ($Count - 1))
            $Branch = if ($IsLast) { "$([char]0x2570)$([char]0x2500) " } else { "$([char]0x251C)$([char]0x2500) " }
            # $Guide = if ($IsLast) { "   " } else { "$([char]0x2502)  " }
            $Marker = if ($Entry.PSIsContainer) { "$([char]0x25B8) " } else { "$([char]0x2022) " }

            if ($Entry.PSIsContainer) {
                Write-Host "$Prefix" -NoNewline
                Write-Host $Branch -NoNewline -ForegroundColor DarkGray
                Write-Host $Marker -NoNewline
                Write-Host $Entry.Name -ForegroundColor Green
                $NextPrefix = if ($IsLast) { "$Prefix   " } else { "$Prefix$([char]0x2502)  " }
                Walk -P $Entry.FullName -Level ($Level + 1) -Prefix $NextPrefix
            }
            else {
                Write-Host "$Prefix" -NoNewline
                Write-Host $Branch -NoNewline -ForegroundColor DarkGray
                Write-Host $Marker -NoNewline
                Write-Host $Entry.Name
            }
        }
    }

    Write-Host "$([char]0x256D)$([char]0x2500) " -NoNewline -ForegroundColor DarkGray
    Write-Host "Parent Dir: " -NoNewline -ForegroundColor Blue
    Write-Host $Root
    Write-Host "$([char]0x2502)" -ForegroundColor DarkGray
    Walk -P $Root -Level 1 -Prefix ""
}

Export-ModuleMember -Function Show-Tree