Традиционные приложения (native application) запускаемые в консоли cmd.exe, как правило не являются unicode-приложениями. Иначе говоря, они ожидают ввод и выводят информацию в обычной кодировке, например, CP866 или CP1251. С другой стороны, Powershell является unicode-приложением. Это означает, что Powershell должен выполнять перекодировку в обе стороны при вызове native application. По умолчанию он это делает в большинстве случаев правильно. Но если на целевой системе вместо кодировки по умолчанию для non-unicode программ стоит не «Русский», что соответствует CP866, а «Английский» — CP437, при работе «русской» native application мы получим проблемы: программа не будет понимать ввод, а ее вывод будет абракадаброй.
Ситуацию можно исправить. В Powershell за перекодировку отвечают две переменные:
[Console]::OutputEncoding : отвечает за перекодировку <native application> -> <Powershell>
$OutputEncoding : отвечает за перекодировку <Powershell> -> <native application>
(Есть ещё [Console]::InputEncoding, которая отвечает за ввод с клавиатуры в консольное приложение)
Есть ещё случай, когда вывод native application происходит не в консоль, а перехватывается Powershell (например, при удаленном вызове через WS-Management). Тогда полученные строки придётся перекодировать «вручную». Пример такого скрипта https://xaegr.wordpress.com/2007/01/24/decoder/
Спасибо за наводку Александр AKA Kazun
Примеры:
[Console]::OutputEncoding = [Text.Encoding]::Unicode
[Console]::OutputEncoding = [Text.Encoding]::UTF8
$OutputEncoding = [Text.Encoding]::GetEncoding(1251)
[Text.Encoding]::Unicode
Filed under: Powershell, Windows |
Добавить комментарий