powershell кириллица в скрипте
О кодировке символов
Краткое описание
Описывает, как PowerShell использует кодировку символов для ввода и вывода строковых данных.
Подробное описание
Юникод — это мировой стандарт кодировки символов. Система использует Юникод исключительно для обработки символов и строк. Подробное описание всех аспектов Юникода см. в стандарте Юникода.
Windows поддерживает юникод и традиционные кодировки. традиционные кодировки, такие как Windows кодовые страницы, используют 8-разрядные значения или сочетания 8-разрядных значений для представления символов, используемых в параметрах определенного языка или географического региона.
Следующие командлеты имеют параметр Encoding :
Пометка порядка байтов
Для обеспечения оптимальной совместимости Избегайте использования спецификаций в файлах UTF-8. платформы unix и служебные программы unix-heritage, также используемые на платформах Windows, не поддерживают спецификации.
Аналогичным образом UTF7 следует избегать кодирования. UTF-7 не является стандартной кодировкой Юникода и записывается без спецификации во всех версиях PowerShell.
Кодировка символов в Windows PowerShell
В PowerShell 5,1 параметр Encoding поддерживает следующие значения:
Для командлетов, записывающих выходные данные в файлы:
New-ModuleManifest а Export-CliXml также создавать файлы UTF-16LE.
Если целевой файл пуст или не существует, Set-Content и Add-Content Используйте Default кодировку. Default — это кодировка, определяемая кодовой страницей устаревшей версии ANSI на языке активного системы.
Export-Csv создает Ascii файлы, но использует другую кодировку при использовании параметра append (см. ниже).
Export-PSSession по умолчанию создает файлы UTF-8 с BOM.
Send-MailMessage по Default умолчанию использует кодировку.
Start-Transcript создает Utf8 файлы с помощью спецификации. При использовании параметра append кодировка может отличаться (см. ниже).
Для команд, которые добавляют к существующему файлу:
Для командлетов, считывающих строковые данные в отсутствие спецификации:
Get-Content и Import-PowerShellDataFile использует Default кодировку ANSI. ANSI также используется механизмом PowerShell при чтении исходного кода из файлов.
Кодировка символов в PowerShell Core
В PowerShell Core (V6 и более поздних версий) параметр Encoding поддерживает следующие значения:
По умолчанию PowerShell Core имеет значение utf8NoBOM для всех выходных данных.
Изменение кодировки по умолчанию
В PowerShell есть две переменные по умолчанию, которые можно использовать для изменения поведения кодировки по умолчанию.
Дополнительные сведения см. в разделе about_Preference_Variables.
При размещении этой команды в профиле PowerShell предпочтение влияет на глобальные параметры сеанса, влияющие на все команды и скрипты, которые явно не задают кодировку.
Аналогичным образом следует включить такие команды в скрипты или модули, которые должны вести себя одинаково. Использование этих команд гарантирует, что командлеты ведут себя одинаково даже при запуске другого пользователя, на другом компьютере или в другой версии PowerShell.
Powershell кириллица в скрипте
Вопрос
Доброго времени суток!
В PowerShell ISE при выполнении команд командной строки выходят каракули, хотя в самой консоли PowerShell всё работает нормально.
По умолчанию кажется 866 кодировка. Ставлю 1251 тоже самое. Ставлю 65001 всё выходит на английском, а хочется на русском!
Ответы
Хорошо, но к каждой команде такое добавлять не совсем рационально. Есть возможность в начале файла ввести команду на смену кодировки и чтобы в дальнейшем всё уже в этой кодировке было? Наподобие команды chcp
ipconfig | Out-Null
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(«cp866»)
Все ответы
Хорошо, но к каждой команде такое добавлять не совсем рационально. Есть возможность в начале файла ввести команду на смену кодировки и чтобы в дальнейшем всё уже в этой кодировке было? Наподобие команды chcp.
Или чтобы эту функцию ConvertTo-Encoding использовать для текущего процесса, т.е. PowerShell`a
Хорошо, но к каждой команде такое добавлять не совсем рационально. Есть возможность в начале файла ввести команду на смену кодировки и чтобы в дальнейшем всё уже в этой кодировке было? Наподобие команды chcp
Спасибо. Помогло. [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(«cp866»)
Однако при новом запуске приходится делать то же самое.
ipconfig | Out-Null
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(«cp866»)
Помогает команда [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(«cp866»), но после закрытия PowerShell ISE, опять каракули и нужно вводить? Можно как-нибудь применить навсегда?
Проблема с Windows Server 2019 Enterprise и Windows 10 Корпоративная LTSC
1 не использовать англоязычные ос в админ целях
2 решение с профилем о котором вспоминал esqado и детально описанное by Kazun
3 не использование ISE.
В качестве замены существует например VSCode или VS Comunity в которых куда удобней работать чем в ISE. Первый бесплатный, второй бесплатный но имеет лицензионные ограничения на размер команды разработчиков и компании.
The opinion expressed by me is not an official position of Microsoft
Основные сведения о кодировке файлов в VS Code и PowerShell
При использовании VS Code для создания и редактирования сценариев PowerShell очень важно, чтобы ваши файлы сохранялись в правильной кодировке символов.
Что такое кодировка и почему она важна?
VS Code управляет интерфейсом ввода строки символов в буфер пользователем и чтения-записи блоков байтов в файловой системе. При сохранении файла в VS Code используется кодирование текста для определения того, какие байты получит каждый символ. Подробные сведения см. в статье О шифровании символов.
И VS Code, и PowerShell устанавливаются с подходящей конфигурацией кодировки по умолчанию. Тем не менее кодировка по умолчанию, используемая PowerShell, была изменена с выпуском PowerShell Core (версии 6.x). Чтобы избежать проблем с PowerShell и расширениями PowerShell в VS Code, необходимо настроить параметры VS Code и PowerShell должным образом.
Распространенные причины проблемы с кодировкой
Проблемы с кодировкой возникают, если кодировка VS Code в целом или вашего файла скрипта не совпадает с кодировкой, ожидаемой в PowerShell. В PowerShell нет способа автоматически определить кодировку файла.
Проблемы с кодировкой более вероятны при использовании символов не из 7-разрядной кодировки ASCII. Пример:
Распространенные причины проблем с кодировкой:
Как определить наличие проблемы с кодировкой
Часто ошибки кодирования в скриптах представляются как ошибки синтаксического анализа. Если вы видите странные последовательности символов в скрипте, это может быть проблемой. В примере ниже тире ( – ) отображается в виде символов ※ :
Некоторые странные последовательности символов, которые можно видеть:
Этот удобный справочник перечисляет распространенные шаблоны, которые указывают на проблему между кодировками UTF-8 и Windows-1252.
Взаимодействие расширения PowerShell для VS Code с кодировками
Расширение PowerShell взаимодействует со скриптами несколькими способами:
Проблема возникает при предположении кодировки, не использующей BOM (такой как UTF-8 без метки порядка байтов или Windows-1252). Расширение PowerShell по умолчанию использует UTF-8. Расширение не может изменить параметры кодировки в VS Code. Дополнительные сведения см. в разделе Проблема № 824.
Выбор подходящей кодировки
Различные системы и приложения могут использовать различные кодировки:
Кодировки Юникода также используют понятие метки порядка следования байтов (BOM). BOM ставится в начале текста, чтобы декодер мог определить, какая кодировка используется в тексте. Для многобайтовых кодировок BOM также указывает порядок следования байтов кодировки. BOM представляются байтами, которые редко встречаются в тексте в Юникоде. Это позволяет сделать обоснованное предположение, что текст записан в Юникоде, если присутствует метка BOM.
BOM не являются обязательными; в мире Linux они не так популярны, поскольку во всех прочих местах используется надежное соглашение UTF-8. Большинство приложений Linux предполагают, что текстовый ввод кодируется в UTF-8. Хотя многие приложения Linux могут распознавать и правильно обрабатывать BOM, некоторые этого не делают, что приводит к появлению артефактов в тексте, открываемом с помощью этих приложений.
Таким образом:
Настройка VS Code
Кодировка VS Code по умолчанию — UTF-8 без метки порядка байтов.
Возможны следующие значения:
Должен отобразиться раскрывающийся список представления графического пользовательского интерфейса или дополнение в представлении JSON.
Чтобы обеспечить автоматическое определение кодировки, если это возможно, можно также добавить следующее:
Вы также можете установить средство отслеживания Gremlins для Visual Studio Code. Это расширение раскрывает определенные символы Юникода, которые могут быть легко повреждены из-за своей невидимости или схожести с другими обычными символами.
Настройка PowerShell
В PowerShell кодировка по умолчанию зависит от версии:
В PowerShell 5 + можно определить кодировку по умолчанию так:
Следующий скрипт может использоваться для определения кодировки, которую ваш сеанс PowerShell выводит для скрипта, где нет метки порядка байтов.
Можно настроить PowerShell так, чтобы использовать заданную кодировку в более общем виде с помощью параметров профиля. См. следующие статьи:
Заставить PowerShell использовать конкретную кодировку для входных данных невозможно. В PowerShell 5.1 и более ранних версий в Windows с языковым стандартом en-US по умолчанию используется кодировка Windows-1252, если отсутствует метка порядка байтов. Другие параметры языкового стандарта могут использовать другую кодировку. Для обеспечения совместимости лучше сохранять скрипты в Юникоде с меткой порядка байтов.
Любые другие имеющиеся у вас инструменты для работы со скриптами PowerShell могут зависеть от выбранных параметров кодировки или преобразовывать скрипты в другую кодировку.
Существующие скрипты
Скрипты, которые уже находятся в файловой системе, могут нуждаться в повторном кодировании в указанную вами кодировку. В нижней строке VS Code вы увидите метку UTF-8. Щелкните ее, чтобы открыть панель действий, и выберите команду Сохранить с кодировкой. Теперь вы можете выбрать новую кодировку для этого файла. Подробные инструкции см. в разделе Кодировка в VS Code.
Если вам нужно повторно кодировать несколько файлов, можно использовать следующий скрипт:
Интегрированная среда сценариев (ISE) PowerShell
При редактировании скриптов с помощью интегрированной среды сценариев PowerShell необходимо синхронизировать здесь параметры кодировки.
Интегрированная среда сценариев должна учитывать метку порядка байтов, но можно также использовать отражение для задания кодировки. Обратите внимание, что это значение не сохраняется между запусками.
Система управления версиями
Некоторые системы управления версиями, например git, игнорируют кодировки; git отслеживает только байты. Поведение других, например Azure DevOps или Mercurial, может отличаться. Даже некоторые средства, основанные на git, полагаются на декодирование текста.
Если это так, убедитесь, что вы:
Среды других участников
Настроив систему управления версиями, убедитесь также, что параметры других участников, работающих над теми файлами, к которым вы предоставляете общий доступ, не переопределяют кодировку путем повторного кодирования файлов PowerShell.
Другие программы
Все другие программы, которые считывают или записывают скрипты PowerShell, могут перекодировать их.
Некоторые из этих средств работают с байтами, а не с текстом, но другие позволяют настраивать кодировки. В случаях, когда необходимо настроить кодировку, используйте те же параметры, что и в вашем редакторе, чтобы предотвратить возникновение проблем.
Другие ресурсы о кодировках в PowerShell
Существует несколько других достойных публикаций на тему кодировок и настройки кодирования в PowerShell:
administra.top
Можно заметить, что используя утилиты CMD в консоли ISE кириллица выводится кракозябрами, а в Powershell.exe — такая проблема не наблюдается.
Давайте выясним что является этому причиной
Например при попытке получить результат команды
мы увидим такую картину
Посмотрим кодировку в обоих консолях следующей командой
Powershell
Теперь посмотрим текущую страницу кодировки (CP) в CMD
Вывод
Как мы убедились, кодировки СMD и Powershell.exe совпадают, а ISE в свою очередь использует Windows-1251
Соответственно ISE ожидает что на вход ему и будут попадать символы в кодировке 1251, а по факту CMD пытается передать их в кодировке DOS — cp866
Решение
Решение достаточно простое — поменять используемую кодировку консоли ISE на cp866 командой:
После этого повторно выполняем нужную нам команду и получаем приемлемый результат
Вы можете получить ошибку следующего вида
Что бы смена кодировки применилась успешно, нужно предварительно выполнить любую CMD команду, которая вернет вам текстовый вывод кракозябрами.
Опять же подойдет Ping, так как при вызове Ping Powershell сразу обращается к Legacy утилите из System32, а не какому то своему встроенному механизму.
После этих действий команда на смену кодировки успешно отработает
Powershell кириллица в скрипте
Вопрос
Всем доброго времени суток.
После конвертации в utf-8, часть символов начинает читатся. Но часть остается вопросами.
IsSingleByte : True
BodyName : IBM437
EncodingName : OEM United States
HeaderName : IBM437
WebName : IBM437
WindowsCodePage : 1252
IsBrowserDisplay : False
IsBrowserSave : False
IsMailNewsDisplay : False
IsMailNewsSave : False
EncoderFallback : System.Text.InternalEncoderBestFitFallback
DecoderFallback : System.Text.InternalDecoderBestFitFallback
IsReadOnly : False
CodePage : 437
Ответы
Увы, но в РФ почему то очень мало кто знает как работать с кодировками вообще и с русскими буквами в частности, все норовят делать «перекодировщики» даже не понимая что они не могут работать. 🙁
Чтоб все работало правильно вам надо сделать две вещи:
1. Сохранять файл скрипта в кодировке где есть кириллица, например UTF-8 или UTF-16. При сохранении файла в notepad следует выбрать одну из этих опций.
2. Использовать для вывода на консоль кодировку где есть кириллица. Опять же, лучше всего использовать UTF-8/UTF-16, но можно и 1251, например. Перекодирование в последнем случае будет выполнено автоматически, никаких нерабочих суррогатов вроде «перекодирования» не потребуется.
Сменить кодировку консоли можно так:
This posting is provided «AS IS» with no warranties, and confers no rights.