Коротко — полностью «одной галочкой» в Windows PowerShell 5.1 глобально переключить всё на UTF‑8 нельзя (поведение кодировок разрозненно: консоль, переменные $OutputEncoding, и поведение cmdlet‑ов — разные вещи). Но достаточно надёжный и практичный способ — положить в профиль PowerShell набор команд, который:
- устанавливает кодировку ввода/вывода консоли в UTF‑8,
- задаёт $OutputEncoding (для внешних процессов/редиректов),
- устанавливает значение по‑умолчанию для часто используемых cmdlet’ов (Out‑File, Set‑Content, Add‑Content, Export‑Csv и т.д.).
Примерный код, который положите в ваш профиль ($PROFILE):
1) Откройте профиль (создайте, если ещё нет):
notepad $PROFILE
(если файл не существует — Notepad предложит создать)
2) Вставьте туда (и сохраните):
# Консоль и внешние процессы — UTF-8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
# По умолчанию для популярных cmdlet'ов — UTF‑8
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
$PSDefaultParameterValues['Set-Content:Encoding'] = 'utf8'
$PSDefaultParameterValues['Add-Content:Encoding'] = 'utf8'
$PSDefaultParameterValues['Export-Csv:Encoding'] = 'utf8'
$PSDefaultParameterValues['ConvertTo-Html:Encoding'] = 'utf8'
После этого перезапустите PowerShell — новое поведение будет действовать автоматически для этой учётной записи и этого хоста PowerShell.
Важные замечания и ограничения
- В PowerShell 5.1 значение 'utf8' часто создаёт UTF‑8 с BOM. Если вам нужен UTF‑8 без BOM, PowerShell 5.1 штатно не очень удобно это сделать через -Encoding. Обходные пути: использовать .NET напрямую, например:
[System.IO.File]::WriteAllText($path, $text, (New-Object System.Text.UTF8Encoding $false))
либо писать свои обёртки/функции.
- [Console]::OutputEncoding управляет кодировкой вывода .NET/PowerShell. Старые консольные/нативные приложения могут по‑прежнему использовать OEM‑кодировку консоли — для них можно выполнить chcp 65001 (в профиле), но это не всегда исправит поведение всех приложений.
- Cmdlet'ы по умолчанию в 5.1 (Set-Content/Out-File/...) раньше по умолчанию писали в UTF‑16LE (Unicode) или использовали Default/OEM в зависимости от cmdlet. Поэтому PSDefaultParameterValues рекомендуется для унификации.
- Если хотите сделать изменение «для всех пользователей», редактируйте профиль AllUsersCurrentHost (путь в $PROFILE.AllUsersCurrentHost) с правами администратора.
Проверка
После перезапуска:
[Console]::OutputEncoding # должен быть UTF‑8
Write-Output 'тест' | Out-File test.txt
Get-Content test.txt # посмотрите содержимое/кодировку файла
Если нужно, могу прислать шаблон профиля с функциями, которые пишут UTF‑8 без BOM, и/или показать, как правильно настроить Export‑Csv/Import‑Csv и работу с FTP/HTTP при загрузке на хостинг.