Get-ChildItem | дерево дает мне странно отформатированное дерево

2960
aPerfectMisterMan

Следующий вход:

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 

...так далее.

Когда я ожидал что-то отформатированное больше похоже на:

├───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` 
5
в PowerShell введите $ OutputEncoding и вставьте результаты Keltari 10 лет назад 0
Смотрите редактирование в посте. aPerfectMisterMan 10 лет назад 0
@MHA, пожалуйста, скопируйте детали в исходное сообщение - [сообщение можно редактировать] (http://superuser.com/posts/745083/edit). Dave 10 лет назад 0
Это определенно похоже на проблему кодирования. Мое дерево работает и кодировка us-ascii. IsSingleByte: True BodyName: us-ascii EncodingName: US-ASCII HeaderName: us-ascii WebName: us-ascii WindowsCodePage: 1252 IsBrowserDisplay: False IsBrowserSave: False IsMailNewsDisplay: True IsMailNewsSave: TruebackExeF: .DecoderReplacementFallback IsReadOnly: True CodePage: 20127 Keltari 10 лет назад 0
Я пытаюсь найти способ перейти на кодовую страницу ... не очень удачно, но я уверен, что в этом проблема Keltari 10 лет назад 0
@Keltari - вы можете изменить выходную кодировку с помощью `$ OutputEncoding = [System.Text.Encoding] :: GetEncoding ()`, but I am not able to repro OP's issue by setting the code page to `1252` Rynant 10 лет назад 0
@MHA Помогает ли использование переключателя ascii для дерева? `GCI | дерево / A` Rynant 10 лет назад 1
Существует также `chcp` для получения и установки кодовой страницы консоли, но я не смог увидеть никаких изменений на дисплее, изменив его. http://technet.microsoft.com/en-us/library/bb490874.aspx Rynant 10 лет назад 0
Дерево не является командой PowerShell, о которой я знаю, и не принимает ввод по каналу. `tree` само по себе должно дать вам дерево, которое вы хотите. Eris 10 лет назад 0
@Eris Tree доступно в расширениях сообщества PowerShell. Однако OP явно не упомянул, используют ли они это или PowerShell обращается к древовидной команде CMD. Iszi 10 лет назад 0
@MHA - Пожалуйста, предоставьте вывод `Get-Command tree`. Iszi 10 лет назад 0
Поскольку я задавал эти вопросы, я перешел на другую машину. Когда я запускаю «дерево», оно работает как задумано. Спасибо за ваш вклад. Если вы сформулируете это как ответ, я приму это. aPerfectMisterMan 10 лет назад 0

3 ответа на вопрос

0
John Oxley

Попробуйте использовать командлет Show-Tree .

09:17 $ Show-Tree C:\Chocolatey\ -Depth 1 C:\Chocolatey\ |--bin \--lib 
0
JamieSee

В зависимости от версии 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($_)) }

-1
Zeth Palmgren

Вы запускаете команду в 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> 
Интересный момент здесь, но я должен сказать, что мой опыт отличается - вывод дерева одинаков независимо от использования консоли или ISE. Установлены ли у вас расширения сообщества или используется дерево CMD? Iszi 10 лет назад 0