Standardmäßig sendet PowerShell UTF-8 anstelle von UTF-16?

31

Standardmäßig gibt PowerShell in Windows anscheinend UTF-16 aus (wenn ich z. B. eine einfache Ausgabe vornehme echo hello > hi.txt, hi.txtendet die Ausgabe in UTF-16). Ich weiß, dass ich dies auf meine gewünschte Textcodierung erzwingen kann, indem ich dies stattdessen tue echo hello | out-file -encoding utf8 hi.txt, aber ich möchte, dass dies nur die Standardeinstellung ist, wenn ich den Umleitungsoperator verwende. Gibt es eine Möglichkeit, dies zu erreichen?

Benjamin Pollack
quelle
1
danke für den tipp für eine alternative, dies vom terminal aus zu tun kann manchmal schneller sein als ein texteditor.
Todd Partridge
In Powershell 6.0 wurde dies überflüssig gemacht. Powershell verwendet jetzt standardmäßig UTF-8 ohne Kodierung für die Umleitung. Siehe github.com/PowerShell/PowerShell/issues/4878
kumarharsh

Antworten:

21

Die Verwendung eines .NET-Dekompilierers in der System.Management.Automation-Assembly (auch bekannt als "Microsoft Windows PowerShell Engine Core Assembly") zeigt das folgende Codefragment:

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

Es sieht für mich also ziemlich hardcodiert aus.

Zu Ihrer Information, dies war auf einem Windows 7 Enterprise x64-System mit PowerShell 2.0 installiert.

Tinister
quelle
5
In PowerShell 5 unter Windows 10 leider noch fest CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
programmiert
3

Sie sind sich nicht sicher, ob dies genau das tut, wonach Sie suchen, aber Sie können versuchen, die Umgebungsvariable wie hier beschrieben festzulegen

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding
OldWolf
quelle
2
Ich glaube nicht, dass es das $OutputEncodingist, was ich brauche. Dies ist in PowerShell auf ASCII festgelegt und wirkt sich auf die Anzeige aus . Ich möchte das Format von Text ändern, der in einer Datei gespeichert ist, die sich von den Steuerelementen (AFAICT) unterscheidet $OutputEncoding.
Benjamin Pollack