Можно заметить, что используя утилиты CMD в консоли ISE кириллица выводится кракозябрами, а в Powershell.exe — такая проблема не наблюдается.
Давайте выясним что является этому причиной
Например при попытке получить результат команды
& "ping" ya.ru
мы увидим такую картину
Посмотрим кодировку в обоих консолях следующей командой
[Console]::outputEncoding
ISE
Powershell
Теперь посмотрим текущую страницу кодировки (CP) в CMD
chcp
Вывод
Как мы убедились, кодировки СMD и Powershell.exe совпадают, а ISE в свою очередь использует Windows-1251
Соответственно ISE ожидает что на вход ему и будут попадать символы в кодировке 1251, а по факту CMD пытается передать их в кодировке DOS — cp866
Решение
Решение достаточно простое — поменять используемую кодировку консоли ISE на cp866 командой:
[Console]::outputEncoding = [System.Text.Encoding]::GetEncoding('cp866')
После этого повторно выполняем нужную нам команду и получаем приемлемый результат
Вы можете получить ошибку следующего вида
Исключение при задании "outputEncoding" : "Неверный дескриптор.
Что бы смена кодировки применилась успешно, нужно предварительно выполнить любую CMD команду, которая вернет вам текстовый вывод кракозябрами.
Опять же подойдет Ping, так как при вызове Ping Powershell сразу обращается к Legacy утилите из System32, а не какому то своему встроенному механизму.
После этих действий команда на смену кодировки успешно отработает
Для PowerShell 7, если иероглифы к примеру в nslookup
[Console]::outputEncoding = [System.Text.Encoding]::GetEncoding(‘windows-1251’)
Ну если говорить про Powershell 7 в приложении Terminal или VSC, так же как и в консоли powershell.exe, там по умолчанию кодировка cp866, поэтому можно привести к windows-1251
Спасибо за совет. Утомила беда с кодировкой(
постоянно при запуске приходится менять кодировку. Можно ли раз и на всегда это как-то сделать?
спасибо, помогло
Было бы всё так просто, но не меняет PS кодировку, когда у тебя открыто куча окон и некоторые, где-то в глубине недр PS имеют процессы, связанные с получением данных в кодировке, которая не соответствует той, которую ты желаешь в данный момент. Не меняет, и всё тут.
В мануале сказано, что для того, чтобы PS поменял кодировку, нужен внешний пинок — получение внешних данных с подтверждённой кодировкой — это страницы интернета. Кто ещё может подтвердить кодировку — ну конечно же он, незаменимый cmd.exe, который при каждом соединении возвращает код ошибки, и то, что мы не видим — кодировку, как я помню.
Вот это то, что я сделал вчера и оно вроде работает. Сегодня была небольшая проблемка — поменял код (сделал смену кодировки после пинка батника) и всё нормально пока
#########################
# https://learn.microsoft.com/en-us/windows/win32/intl/code-page-identifiers
$codepage = @{‘netName’ = ‘utf-8′;’identifier’ = 65001}
# $codepage = @{‘netName’ = ‘windows-1251′;’identifier’ = 1251}
# $codepage = @{‘netName’ = ‘cp866′;’identifier’ = 866}
try{$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding($codepage.netName)}catch{}
&C:\Windows\System32\cmd.exe (‘/c echo off&chcp {0}>NUL&exit ‘-f $codepage.identifier) #просто возвращает код отсутствия ошибки 0, который и провоцирует смену консоли
#cls
if([System.Console]::OutputEncoding.WebName -ne ([System.Text.Encoding]::GetEncoding($codepage.netName)).WebName){Write-Host ‘»Скрипт выполняется в кодировке отличной от ‘([System.Text.Encoding]::GetEncoding($codepage.netName)).WebName’. Некоторые символы могут оказаться нечитаемы.’}
Write-Host ‘текущая PS консоль'([System.Console]::OutputEncoding.WebName)
###############################################
не меняет PS_ISE — хотел исправить