Обрабатывать вывод ASCII при выполнении внешнего exe-файла в powershell - PullRequest
1 голос
/ 16 октября 2019

При вызове исполняемого файла AWS CLI из powershell (v5.1) специальные символы неправильно обрабатываются powershell. Вот пример:

# This works: powershell is forwarding the output directly to stdout without touching it
> aws cognito-idp describe-user-pool --user-pool-id $MyPoolId
{
    "UserPool": {
        [...]
        "EmailVerificationMessage": "Votre code de vérification est {####}."
        [...]
    }
}

# This doesn't work: powershell handles the command's output encoding improperly
> aws cognito-idp describe-user-pool --user-pool-id $MyPoolId | Out-Host
{
    "UserPool": {
        [...]
        "EmailVerificationMessage": "Votre code de vÚrification est {####}."
        [...]
    }
}

Проблема точно такая же, если вы хотите сохранить вывод в переменную ($foo = aws ...) или перенаправить его в файл (| Out-File "foo.json" или > "foo.json"),Изменение выходной кодировки (| Out-File "foo.json" -Encoding xxx) не решает проблему, потому что ошибка синтаксического анализа возникает, когда powershell декодирует вывод exe, а не когда он выводит его в файл. Эта проблема отсутствует при выполнении того же действия с CMD.

Мы могли бы переключиться на инструменты AWS для powershell (которые должны правильно обрабатывать кодирование) вместо использования стандартного AWSCLI , но мне было интересно, как бы вы решили эту проблему, когда нет альтернативы powershell.

1 Ответ

1 голос
/ 16 октября 2019

Как упомянуто @AdminOfThings в этом комментарии , кодировка, используемая powershell для декодирования вывода из exe, управляется [Console]::OutputEncoding (тогда как $OutputEncoding управляеткодировка, используемая для отправки данных в exe).

Значение этой переменной в моем случае было ibm850:

> [Console]::OutputEncoding

IsSingleByte      : True
BodyName          : ibm850
EncodingName      : Europe de l'Ouest (DOS)
HeaderName        : ibm850
WebName           : ibm850
WindowsCodePage   : 1252
IsBrowserDisplay  : False
IsBrowserSave     : False
IsMailNewsDisplay : False
IsMailNewsSave    : False
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : False
CodePage          : 850

Переключение на iso-8859-1 решеномой выпуск:

> [Console]::OutputEncoding = [System.Text.Encoding]::Default
> [Console]::OutputEncoding

IsSingleByte      : True
BodyName          : iso-8859-1
EncodingName      : Europe de l'Ouest (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

Тогда:

> aws cognito-idp describe-user-pool --user-pool-id $MyPoolId | Out-Host
{
    "UserPool": {
        [...]
        "EmailVerificationMessage": "Votre code de vérification est {####}."
        [...]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...