За замовчуванням PowerShell випромінює UTF-8 замість UTF-16?


31

За замовчуванням PowerShell в Windows, здається, виводить UTF-16 (наприклад, якщо я виконую простий echo hello > hi.txt, то hi.txtзакінчується в UTF-16). Я знаю, що я можу примусити це до бажаного кодування тексту, замість цього роблячи echo hello | out-file -encoding utf8 hi.txt, але те, що я хотів би, щоб це було просто за замовчуванням, коли я використовую оператор перенаправлення. Чи є спосіб досягти цього?


1
дякую за пораду за альтернативу, робити це з терміналу може бути швидше, ніж іноді текстовий редактор.
Тодд Партрідж

У Powershell 6.0 це зробилося непотрібним - Powershell тепер за замовчуванням застосовується до UTF-8 без кодування для перенаправлення. Дивіться github.com/PowerShell/PowerShell/isissue/4878
kumarharsh

Відповіді:


21

Використання .NET-декомпілятора на збірці System.Management.Automation (він же "Microsoft Windows PowerShell Engine Assembly Assembly") розкриває цей фрагмент коду:

// class: System.Management.Automation.RedirectionNode
private PipelineProcessor BuildRedirectionPipeline(string path, ExecutionContext context)
{
    CommandProcessorBase commandProcessorBase = context.CreateCommand("out-file");
    commandProcessorBase.AddParameter("-encoding", "unicode");
    if (this.Appending)
    {
        commandProcessorBase.AddParameter("-append", true);
    }
    commandProcessorBase.AddParameter("-filepath", path);
    ...

Отже, мені це здається досить жорстким.

FYI, це було в системі Windows 7 Enterprise x64 із встановленим PowerShell 2.0.


5
На жаль, в PowerShell 5 на Windows 10, на жаль:CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
Artfunkel

3

Не впевнений, чи це буде робити саме те, що ви шукаєте, але ви можете спробувати встановити змінну середовища, як згадувалося тут

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding

2
Я не думаю, що $OutputEncodingце зовсім те, що мені потрібно; що встановлено в ASCII в PowerShell і впливає на те, як відображаються речі . Що я хочу зробити, це змінити формат тексту, який зберігається у файлі, який (AFAICT) відрізняється від того, що $OutputEncodingконтролює.
Бенджамін Поллак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.