以下输入:
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。以下是一些解决此问题的方法:
- 用于
tree.com /A
强制树使用 ASCII 而不是扩展字符。 - 使用 将 PowerShell 中的控制台输出编码更改为代码页 437
chcp 437; [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(437)
。 - 转换为字节并重新编码输出
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。有两种处理此问题的选项,它们效果很好,影响小且简单。
- 只需使用树‘/A’。
- 使用以下代码将树的输出转换为字节并使用适当的代码页加载它:
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>