如何在 Windows 树命令输出中显示文件的树枝?

如何在 Windows 树命令输出中显示文件的树枝?

我正在使用标志/a/f

我也想让子目录中出现|---。目前,它列出了子目录中的文件,但没有显示|---

答案1

没有办法在文件名之前tree输出---,所以你必须使用其他tree实现。这是 PowerShell 中的一个

param(
    [string]$Path,
    [Alias("F")]
    [switch]$ShowFilesFirst,
    [Alias("A")]
    [switch]$UseAscii,
    [Alias("D")]
    [switch]$ShowDirectoriesOnly
)

$BRANCHES = @(
    [PsCustomObject]@{ First = "├───"; Last = "└───"; Dir = "│   " },
    [PsCustomObject]@{ First = "+---"; Last = "\---"; Dir = "|   " }
)

function Show-Files([System.IO.FileInfo[]]$files, [string]$prefix, [bool]$showCorner) {
    for ($i = 0; $i -lt $files.Length; ++$i) {
        $f = $files[$i]
        if (($i -eq $files.Length - 1) -and $showCorner) {
            echo ($prefix + $BRANCHES[$UseAscii.IsPresent].Last  + $f.Name)
        } else {
            echo ($prefix + $BRANCHES[$UseAscii.IsPresent].First + $f.Name)
        }
    }
}

function Show-Tree([string]$path, [string]$prefix) {
    $folders = @(Get-ChildItem -Directory $path)
    $files   = @(Get-ChildItem -File      $path)

    if ($ShowFilesFirst -and -not $ShowDirectoriesOnly) {
        $showFileCorner = ($folders.Length -eq 0) -or (-not $ShowFilesFirst)
        Show-Files $files $prefix $showFileCorner
    }
    
    for ($i = 0; $i -lt $folders.Length; ++$i) {
        $d = $folders[$i]
        $showDirCorner = ($files.Length -eq 0) -or $ShowFilesFirst
        if (($i -eq $folders.Length - 1) -and $showDirCorner) {
            echo ($prefix + $BRANCHES[$UseAscii.IsPresent].Last  + $d.Name)
            Show-Tree -path $d.FullName -prefix "$prefix    "
        } else {
            echo ($prefix + $BRANCHES[$UseAscii.IsPresent].First + $d.Name)
            Show-Tree -path $d.FullName -prefix ($prefix + $BRANCHES[$UseAscii.IsPresent].Dir)
        }
    }
    
    if (-not $ShowFilesFirst -and -not $ShowDirectoriesOnly) {
        Show-Files $files $prefix $true
    }
}

if ($Path -eq "") {
    (Get-Location).Path
} else {
    echo $Path
}
Show-Tree -path $Path -prefix ""

另存为tree.ps1并运行即可。参数:

  • -Path:树的路径,可选
  • -ShowFilesFirst/ -F:先打印文件,再打印文件夹。默认情况下,将先打印文件夹
  • -UseAscii/ -A:仅使用 ASCII 字符,而不使用 Unicode
  • -ShowDirectoriesOnly/ -D:不打印文件,与默认tree行为相同

示例输出:

注意:C:\Windows\Boot\DVD> C:\tree.ps1
C:\Windows\启动\DVD
═────电喷
│ │────en-US
│ │ ═────efisys.bin
│ │ └───efisys_noprompt.bin
│ │────BCD
│ └───boot.sdi
└───PCAT
    ─────en-US
    │ └───bootfix.bin
    │───BCD
    │ │启动.sdi
    └───etfsboot.com
PS C:\Windows\Boot\DVD> C:\tree.ps1 -A -ShowFilesFirst
C:\Windows\启动\DVD
+---电喷
| +---BCD
| +---启动.sdi
| \---en-US
| +---efisys.bin
| \---efisys_noprompt.bin
\---PCAT
    +---BCD
    +---启动.sdi
    +---etfsboot.com
    \---en-US
        \---bootfix.bin

答案2

一种解决方法是解析输出tree并替换文件前的空格。最简单的方法是使用 PowerShell 中的正则表达式,如下所示

tree /a /f |% { $_ -creplace '^(([ |]   )*)[| ]   ([^+|\\ ])', '$1+---$3' }

它的工作原理是将前 N 个文件夹级别(其表示包含一个空格或一个|字符后跟 3 个空格)与进行匹配^(([ |] )*),然后检查最后一级中可能的垂直线,后跟 3 个空格和文件名中的字符:[| ] ([^+|\\ ])

一个小的限制是最后一个文件不会显示“圆角” \。示例输出:

PS C:\Windows\Boot\DVD> 树 /f
文件夹路径列表
卷序列号为 74FF-D5FA
C:。
═────电喷
│ │ 屬性
│ │ 启动.sdi
│ │
│ └───en-US
│ efisys.bin
│ efisys_noprompt.bin
└───PCAT
    │ 背心
    │ 启动.sdi
    │ etfsboot.com
    └───en-US
            引导修复程序

PS C:\Windows\Boot\DVD> 树 /a /f |% {
    $_ -creplace '^(([ |] )*)[| ]([^+|\\ ])','$1+---$3'}
文件夹路径列表
卷序列号为 74FF-D5FA
C:。
+---电喷
| +---BCD
| +---启动.sdi
| |
| \---en-US
| +---efisys.bin
| +---efisys_noprompt.bin
|
\---PCAT
    +---BCD
    +---启动.sdi
    +---etfsboot.com
    |
    \---en-US
        +---bootfix.bin

答案3

如果你不介意写一点代码,你可能想看看 Eric Lippert 的博客,他有一个编码挑战,可以做一些类似于你在他帖子中寻找的事情老式树木展示他还发布了他的解决方案Eric 针对老式树木倾倒问题的解决方案

相关内容