Powershell. Исправить шрифт в консоли ISE

Можно заметить, что используя утилиты 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, а не какому то своему встроенному механизму.

После этих действий команда на смену кодировки успешно отработает

7 мыслей о “Powershell. Исправить шрифт в консоли ISE”

  1. Для PowerShell 7, если иероглифы к примеру в nslookup
    [Console]::outputEncoding = [System.Text.Encoding]::GetEncoding(‘windows-1251’)

    1. Ну если говорить про Powershell 7 в приложении Terminal или VSC, так же как и в консоли powershell.exe, там по умолчанию кодировка cp866, поэтому можно привести к windows-1251

  2. постоянно при запуске приходится менять кодировку. Можно ли раз и на всегда это как-то сделать?

  3. Было бы всё так просто, но не меняет 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)
    ###############################################

Добавить комментарий

Ваш адрес email не будет опубликован.