¿PowerShell predeterminado para emitir UTF-8 en lugar de UTF-16?

31

De forma predeterminada, PowerShell en Windows parece generar UTF-16 (por ejemplo, si hago un simple echo hello > hi.txt, hi.txttermina en UTF-16). Sé que puedo forzar esto a mi codificación de texto deseada haciendo en su lugar echo hello | out-file -encoding utf8 hi.txt, pero lo que me gustaría es que sea el valor predeterminado cuando uso el operador de redirección. ¿Hay alguna forma de lograr esto?

Benjamin Pollack
fuente
1
Gracias por el consejo de una alternativa, hacer esto desde el terminal puede ser más rápido que un editor de texto a veces.
Todd Partridge
En Powershell 6.0, esto se ha vuelto innecesario: Powershell ahora tiene el valor predeterminado UTF-8 sin codificación para la redirección. Ver github.com/PowerShell/PowerShell/issues/4878
kumarharsh

Respuestas:

21

El uso de un descompilador .NET en el ensamblado System.Management.Automation (también conocido como "Microsoft Windows PowerShell Engine Core Assembly") 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);
    ...

Por lo tanto, me parece bastante rígido.

FYI, esto fue en el sistema Windows 7 Enterprise x64 con PowerShell 2.0 instalado.

Tinister
fuente
55
Todavía codificado en PowerShell 5 en Windows 10, desafortunadamente:CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
Artfunkel
3

No estoy seguro de si esto hará exactamente lo que está buscando, pero puede intentar establecer la variable de entorno como se menciona aquí

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding
OldWolf
fuente
2
No creo que $OutputEncodingsea ​​lo que necesito; está configurado en ASCII en PowerShell y afecta la forma en que se muestran las cosas . Lo que quiero hacer es cambiar el formato del texto que se guarda en un archivo, que (AFAICT) es diferente de lo que $OutputEncodingcontrola.
Benjamin Pollack