O PowerShell padrão para emitir UTF-8 em vez de UTF-16?

31

Por padrão, o PowerShell no Windows parece estar produzindo UTF-16 (por exemplo, se eu fizer um simples echo hello > hi.txt, hi.txtacaba no UTF-16). Eu sei que posso forçar isso para a codificação de texto desejada echo hello | out-file -encoding utf8 hi.txt, mas o que eu gostaria é que isso seja o padrão quando eu usar o operador de redirecionamento. Existe alguma maneira de conseguir isso?

Benjamin Pollack
fonte
1
obrigado pela dica de uma alternativa, fazer isso no terminal pode ser mais rápido do que um editor de texto às vezes.
Todd Partridge
No Powershell 6.0, isso foi desnecessário - o Powershell agora assume o padrão UTF-8 sem codificação para redirecionamento. Veja github.com/PowerShell/PowerShell/issues/4878
kumarharsh

Respostas:

21

O uso de um descompilador .NET no assembly System.Management.Automation (também conhecido como "Conjunto Principal do Microsoft Windows PowerShell Engine") revela este fragmento de código:

// 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);
    ...

Então, parece muito codificado para mim.

Para sua informação, estava no sistema Windows 7 Enterprise x64 com o PowerShell 2.0 instalado.

Tinister
fonte
5
Ainda codificado no PowerShell 5 no Windows 10, infelizmente:CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
Artfunkel
3

Não tenho certeza se isso fará exatamente o que você está procurando, mas você pode tentar definir a variável de ambiente conforme mencionado aqui

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding
OldWolf
fonte
2
Eu não acho que $OutputEncodingé exatamente o que eu preciso; definido como ASCII no PowerShell e afeta a maneira como as coisas são exibidas . O que eu quero fazer é alterar o formato do texto salvo em um arquivo, que (AFAICT) é diferente do que $OutputEncodingcontrola.
22712 Benjamin Benjamin Pollack