默认PowerShell发出UTF-8而不是UTF-16?


31

默认情况下,Windows中的PowerShell似乎正在输出UTF-16(例如,如果我做一个simple echo hello > hi.txt,则hi.txt最终以UTF-16结尾)。我知道我可以通过代替来将其强制为所需的文本编码echo hello | out-file -encoding utf8 hi.txt,但是我想要的是使用重定向运算符时将其作为默认值。有什么办法可以做到这一点?


1
感谢您提供替代方法的提示,有时从终端执行此操作可能比文本编辑器更快。
Todd Partridge

在Powershell 6.0中,这变得不必要了-Powershell现在默认为UTF-8,无需进行重定向编码。参见github.com/PowerShell/PowerShell/issues/4878
kumarharsh

Answers:


21

在System.Management.Automation程序集(也称为“ Microsoft Windows PowerShell引擎核心程序集”)上使用.NET反编译器将显示以下代码片段:

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

因此,对我来说,它看起来像是硬编码的。

仅供参考,这是在安装了PowerShell 2.0的Windows 7 Enterprise x64系统上。


5
不幸的是,仍然在Windows 10上的PowerShell 5中进行了硬编码:CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
Artfunkel 2015年

3

不知道这是否能完全满足您的要求,但是您可以尝试按此处所述设置环境变量

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

2
我认为不是我$OutputEncoding真正需要的。在PowerShell中将其设置为ASCII,并影响事物的显示方式。我想要做的是更改保存在文件中的文本格式,该格式(AFAICT)与$OutputEncoding控件不同。
本杰明·波拉克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.