windows - 打印目录树但排除 Windows cmd 上的文件夹

标签 windows powershell command-line

我想打印不包括文件夹的目录树。我已经知道像这样打印树的基本方法:

tree /A > tree.txt

我想实现这样的目标:

tree /A [exclude folder node_modules] > tree.txt

最佳答案

cmd.exe 的内部 tree 命令支持排除目录。

  • 如果您只需要按名称排除目录本身不需要它们的整个子树 (子目录及其后代),参见 nferrell's answer .

  • 如果您需要排除与给定名称匹配的目录的整个子树,则需要做更多的工作 - 见下文

下面是 PowerShell 函数 tree 的源代码,它模拟了 cmd.exetree 命令的行为,同时:

  • 提供按名称选择性排除子树
    注意:您可以指定由 , 分隔的多个名称,名称可以是通配符模式 - 请注意,它们仅适用于目录 name,但不是完整路径。

  • 提供跨平台支持
    注意:请务必使用 带 BOM 的 UTF-8 编码保存脚本,以便脚本在没有 -Ascii 的情况下正常运行。

  • 提供开关 -IncludeFiles 也可以打印文件

加载下面的函数后,所需的命令如下所示:

tree -Exclude node_modules -Ascii > tree.txt

运行 tree -?Get-Help tree 获取更多信息。


### `tree` source code (add to your `$PROFILE`, for instance; PSv4+):

function tree {
  <#
  .SYNOPSIS
  Prints a directory's subtree structure, optionally with exclusions.                        #'

  .DESCRIPTION
  Prints a given directory's subdirectory structure recursively in tree form,
  so as to visualize the directory hierarchy similar to cmd.exe's built-in
  'tree' command, but with the added ability to exclude subtrees by directory
  names.

  NOTE: Symlinks to directories are not followed; a warning to that effect is
        issued.

  .PARAMETER Path
  The target directory path; defaults to the current directory.
  You may specify a wildcard pattern, but it must resolve to a single directory.

  .PARAMETER Exclude
  One or more directory names that should be excluded from the output; wildcards
  are permitted. Any directory that matches anywhere in the target hierarchy
  is excluded, along with its subtree.
  If -IncludeFiles is also specified, the exclusions are applied to the files'
  names as well.

  .PARAMETER IncludeFiles
  By default, only directories are printed; use this switch to print files
  as well.

  .PARAMETER Ascii
  Uses ASCII characters to visualize the tree structure; by default, graphical
  characters from the OEM character set are used.

  .PARAMETER IndentCount
  Specifies how many characters to use to represent each level of the hierarchy.
  Defaults to 4.

  .PARAMETER Force
  Includes hidden items in the output; by default, they're ignored.

  .NOTES
  Directory symlinks are NOT followed, and a warning to that effect is issued.

  .EXAMPLE
  tree

  Prints the current directory's subdirectory hierarchy.

  .EXAMPLE
  tree ~/Projects -Ascii -Force -Exclude node_modules, .git

  Prints the specified directory's subdirectory hierarchy using ASCII characters
  for visualization, including hidden subdirectories, but excluding the
  subtrees of any directories named 'node_modules' or '.git'.

  #>

    [cmdletbinding(PositionalBinding=$false)]
    param(
      [parameter(Position=0)]
      [string] $Path = '.',
      [string[]] $Exclude,
      [ValidateRange(1, [int]::maxvalue)]
      [int] $IndentCount = 4,
      [switch] $Ascii,
      [switch] $Force,
      [switch] $IncludeFiles
    )

    # Embedded recursive helper function for drawing the tree.
    function _tree_helper {

      param(
        [string] $literalPath,
        [string] $prefix
      )

      # Get all subdirs. and, if requested, also files.
      $items = Get-ChildItem -Directory:(-not $IncludeFiles) -LiteralPath $LiteralPath -Force:$Force

      # Apply exclusion filter(s), if specified.
      if ($Exclude -and $items) {
        $items = $items.Where({ $name = $_.Name; -not $Exclude.Where({ $name -like $_ }, 'First') })
      }

      if (-not $items) { return } # no subdirs. / files, we're done

      $i = 0
      foreach ($item in $items) {
        $isLastSibling = ++$i -eq $items.Count
        # Print this dir.
        $prefix + $(if ($isLastSibling) { $chars.last } else { $chars.interior }) + $chars.hline * ($indentCount-1) + $item.Name
        # Recurse, if it's a subdir (rather than a file).
        if ($item.PSIsContainer) {
          if ($item.LinkType) { Write-Warning "Not following dir. symlink: $item"; continue }
          $subPrefix = $prefix + $(if ($isLastSibling) { $chars.space * $indentCount } else { $chars.vline + $chars.space * ($indentCount-1) })
          _tree_helper $item.FullName $subPrefix
        }
      }
    } # function _tree_helper

    # Hashtable of characters used to draw the structure
    $ndx = [bool] $Ascii
    $chars = @{
      interior = ('├', '+')[$ndx]
      last = ('└', '\')[$ndx]                                                                #'
      hline = ('─', '-')[$ndx]
      vline = ('│', '|')[$ndx]
      space = ' '
    }

    # Resolve the path to a full path and verify its existence and expected type.
    $literalPath = (Resolve-Path $Path).Path
    if (-not $literalPath -or -not (Test-Path -PathType Container -LiteralPath $literalPath) -or $literalPath.count -gt 1) { throw "'$Path' must resolve to a single, existing directory."}

    # Print the target path.
    $literalPath

    # Invoke the helper function to draw the tree.
    _tree_helper $literalPath

  }

关于windows - 打印目录树但排除 Windows cmd 上的文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43810090/

相关文章:

c - 传递指针变量以存储字符串数组(命令行参数)

windows - 配置安装程序以在 Windows 启动时启用/禁用启动

windows - 运行 MapReduce 作业时出错 : not a valid Inet address

windows - 有没有办法在 Perl 脚本中使用移动函数来获取文件传输的进度?

powershell - 难以模拟 Invoke-WebRequest 的 BasicHtmlWebResponseObject

azure - 启动-AzureStorageBlobCopy 无法复制 vhd

python - 通过命令行使用 Python 进行交互式绘图

PHP 没有在 Windows 上加载 php_pgsql.dll

powershell - 无法使用 powershell 生成的随 secret 码打开 7z 文件

iphone - 如何从命令行运行 UIAutomation 脚本到模拟器