PowerShell par défaut pour émettre UTF-8 au lieu de UTF-16?

31

Par défaut, PowerShell dans Windows semble sortir UTF-16 (par exemple, si je fais un simple echo hello > hi.txt, puis hi.txtse retrouve dans UTF-16). Je sais que je peux forcer cela à l'encodage de texte souhaité en le faisant echo hello | out-file -encoding utf8 hi.txt, mais ce que j'aimerais, c'est que ce soit juste la valeur par défaut lorsque j'utilise l'opérateur de redirection. Y'a-t-il une quelconque façon de réussir cela?

Benjamin Pollack
la source
1
merci pour l'astuce pour une alternative, faire cela depuis le terminal peut parfois être plus rapide qu'un éditeur de texte.
Todd Partridge
Dans Powershell 6.0, cela a été rendu inutile - Powershell utilise désormais par défaut UTF-8 sans encodage pour la redirection. Voir github.com/PowerShell/PowerShell/issues/4878
kumarharsh

Réponses:

21

L'utilisation d'un décompilateur .NET sur l'assembly System.Management.Automation (alias «Microsoft Windows PowerShell Engine Core Assembly») révèle ce fragment de code:

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

Donc, cela me semble assez codé en dur.

Pour info, c'était sur le système Windows 7 Enterprise x64 avec PowerShell 2.0 installé.

Tinister
la source
5
Toujours codé en dur dans PowerShell 5 sur Windows 10, malheureusement:CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
Artfunkel
3

Je ne sais pas si cela fera exactement ce que vous recherchez, mais vous pouvez essayer de définir la variable d'environnement comme mentionné ici

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding
OldWolf
la source
2
Je ne pense pas que $OutputEncodingc'est tout à fait ce dont j'ai besoin; qui est défini sur ASCII dans PowerShell et affecte la façon dont les choses sont affichées . Ce que je veux faire, c'est changer le format du texte qui est enregistré dans un fichier, ce qui (AFAICT) est différent de ce que $OutputEncodingcontrôle.
Benjamin Pollack