Get-ChildItem | tree 给了我一个格式奇怪的树

Get-ChildItem | tree 给了我一个格式奇怪的树

以下输入:

PS STG:\> Get-ChildItem | tree

给我

Folder PATH listing for volume Data
Volume serial number is 6576-C540
D:.
ÃÄÄÄAPK
ÃÄÄÄAssets
³   ÃÄÄÄAnimations
³   ³   ÃÄÄÄCharacters
³   ³   ³   ÀÄÄÄinhabitant
³   ³   ÃÄÄÄEnvironment
³   ³   ÀÄÄÄProps
³   ÃÄÄÄMaterials
³   ³   ÃÄÄÄCharacters
³   ³   ³   ÀÄÄÄinhabitant
³   ³   ÃÄÄÄEnvironment
³   ³   ÃÄÄÄParticles
³   ³   ³   ÀÄÄÄasteroidParticle
³   ³   ÀÄÄÄProps
³   ÃÄÄÄMeshes
³   ³   ÃÄÄÄCharacters
³   ³   ³   ÀÄÄÄinhabitant
³   ³   ÃÄÄÄEnvironment
³   ³   ÀÄÄÄProps

...ETC。

当我期待一些格式更像以下内容时:

├───APK
├───Assets
    └───Animations
    |   └───Characters
    |   |   └───inhabitant
    |   ├───Environment
    |   └───Props
    └───Materials
    |   └───Characters
    |   |   └───inhabitant
    |   ├───Environment
    |   └───Particles
    |   |   └───asteroidParticle
    |   └───Props
    └───Meshes
        └───Characters
        |   └───inhabitant
        ├───Environment
        └───Props

我做错了什么/理解错了什么?

这是的值$OutputEncoding

IsSingleByte      : True
BodyName          : iso-8859-1
EncodingName      : Western European (Windows)
HeaderName        : Windows-1252
WebName           : Windows-1252
WindowsCodePage   : 1252
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 1252`

答案1

默认的命令提示符控制台编码是代码页 437,tree.com 默认使用扩展字符。PowerShell ISE 的默认控制台输出代码页是 1252。以下是一些解决此问题的方法:

  1. 用于tree.com /A强制树使用 ASCII 而不是扩展字符。
  2. 使用 将 PowerShell 中的控制台输出编码更改为代码页 437 chcp 437; [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(437)
  3. 转换为字节并重新编码输出tree.com | %{ [System.Text.Encoding]::GetEncoding('IBM437').GetString([Console]::OutputEncoding.GetBytes($_)) }

请注意,选项 2 可能会对其他一些内容的显示产生影响。

答案2

根据 PowerShell 的版本以及是否存在社区扩展,您实际上可能会调用 C:\Windows\System32\tree.com。出现乱码是因为 PowerShell 没有使用正确的编码来显示 tree.com 默认使用的扩展字符。您可以使用 chcp.com 查看命令处理器的当前代码页设置。通常的默认值是代码页 437。PowerShell 默认使用代码页 1252。有两种处理此问题的选项,它们效果很好,影响小且简单。

  1. 只需使用树‘/A’。
  2. 使用以下代码将树的输出转换为字节并使用适当的代码页加载它:

tree | %{ [System.Text.Encoding]::GetEncoding('IBM437').GetString($OutputEncoding.GetBytes($_)) }

答案3

tree没有达到您想象的效果。

tree不是 PowerShell cmdlet。提出这个问题时它还不存在,现在在 PowerShell 5.1 中它也不存在。它是一个 DOS 命令。它不接受任何输入。当您这样做时,您根本gci | tree没有使用的输出。Get-ChildItem

唯一正确的解决方案是不使用,tree而是使用适当的 PowerShell cmdlet。

答案4

您是否在 Powershell 或 Powershell ISE 中运行该命令?

是有区别的。

这是我在 Powershell ISE 中获得的结果:

PS C:\powershell> Get-ChildItem | tree
Folder PATH listing
Volume serial number is XXXX-XXXX
C:.
ÃÄÄÄFolder 1
³   ÃÄÄÄSubfolder 1
³   ÃÄÄÄSubfolder 2
³   ÃÄÄÄSubfolder 3
³   ÀÄÄÄSubfolder 4
ÃÄÄÄFolder 2
³   ÃÄÄÄSubfolder 1
³   ÃÄÄÄSubfolder 2
³   ÃÄÄÄSubfolder 3
³   ÀÄÄÄSubfolder 4
ÃÄÄÄFolder 3
³   ÃÄÄÄSubfolder 1
³   ÃÄÄÄSubfolder 2
³   ÃÄÄÄSubfolder 3
³   ÀÄÄÄSubfolder 4
ÀÄÄÄFolder 4
    ÃÄÄÄSubfolder 1
    ÃÄÄÄSubfolder 2
    ÃÄÄÄSubfolder 3
    ÀÄÄÄSubfolder 4

PS C:\powershell> 

这是我在 Powershell 中得到的结果:

PS C:\powershell> Get-childitem | tree
Folder PATH listing
Volume serial number is XXXX-XXXX
C:.
+---Folder 1
¦   +---Subfolder 1
¦   +---Subfolder 2
¦   +---Subfolder 3
¦   +---Subfolder 4
+---Folder 2
¦   +---Subfolder 1
¦   +---Subfolder 2
¦   +---Subfolder 3
¦   +---Subfolder 4
+---Folder 3
¦   +---Subfolder 1
¦   +---Subfolder 2
¦   +---Subfolder 3
¦   +---Subfolder 4
+---Folder 4
    +---Subfolder 1
    +---Subfolder 2
    +---Subfolder 3
    +---Subfolder 4

PS C:\powershell>

相关内容