Дерево выглядит на Cmd иначе, чем на Powershell - PullRequest
2 голосов
/ 30 апреля 2020

Почему команда дерева на Powershell выглядит иначе, чем на Cmd.

Powershell vs cmd tree command

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020
  • Проблема возникает только в PowerShell ISE , когда вывод из внешних программ, таких как tree.com , не передается прямо к консоли.

  • Чтобы исправить это, необходимо (временно) изменить [Console]::OutputEncoding, чтобы он соответствовал активной кодовой странице действующего OEM вашей системы , поскольку для кодировки символов tree.com используется:

# Switch the encoding that PowerShell expects external programs to use
# to the active OEM code page.
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(
  [cultureinfo]::CurrentCulture.TextInfo.OEMCodePage
)

# tree.com now produces the expected output in the ISE
tree

Примечание:

  • Даже в обычном консольном окне / Windows Окно терминала и в коде Visual Studio [Console]::OutputEncoding может войти в игру, но только когда вы захватываете или перенаправляете вывод внешней программы (например, $treeOutput = tree или tree | ...).

    • Как указано выше, это , а не , необходимый для прямого вывода на дисплей - за исключением ISE, где [Console]::OutputEncoding имеет значение даже тогда, которое по умолчанию активно для системы ANSI устаревшая кодовая страница.
  • Для правильной работы PowerShell rpret выходные данные внешней программы при захвате или перенаправлении, [Console]::OutputEncoding должно соответствовать фактическому кодированию, используемому этой программой .

Поэтому, если вы хотите захватить или перенаправить tree.com s вывод, вам может необходимо установить [Console]::OutputEncoding:

Короче говоря, если [Console]::OutputEncoding.CodePage не соответствует коду номер страницы, сообщаемый [cultureinfo]::CurrentCulture.TextInfo.OEMCodePage - например, 437 в системах US-Engli sh - настройка [Console]::OutputEncoding необходима .

  • In console windows и Windows Terminal windows это обычно , а не необходимо (начиная с PowerShell 7.0) - это необходимо, только если вы явно указали например, изменил активную кодовую страницу на UTF-8 - см. этот ответ ; обратите внимание, что UTF-8 может стать по умолчанию со временем.

  • В Код Visual Studio , однако, является необходимым по умолчанию, поскольку в интегрированной консоли PowerShell [Console]::OutputEncoding по умолчанию используется UTF-8 (кодовая страница 65001).

0 голосов
/ 30 апреля 2020

Я полагаю, это потому, что это одна из тех команд, для которых PowerShell запускает cmd в фоновом режиме, а затем направляет вывод на Write-Host , аналогично ping или ipconfig

...