编码

  • 低版本(好像不是powershell6)默认UTF16 LE读写文件
  • https://learn.microsoft.com/zh-cn/powershell/scripting/dev-cross-plat/vscode/understanding-file-encoding?view=powershell-7.6
  • [System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8
    • 这仅仅只是设置控制台编码
    • [Console]::InputEncoding = [System.Text.Encoding]::UTF8
      • 这也仅仅只是输入用UTF8
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8'
    • 这个将会应用于所有命令的编码,如Get-Content
## 查看编码
[psobject].Assembly.GetTypes() | Where-Object { $_.Name -eq 'ClrFacade'} |
  ForEach-Object {
    $_.GetMethod('GetDefaultEncoding', [System.Reflection.BindingFlags]'nonpublic,static').Invoke($null, @())
  }



## 推断编码
$badBytes = [byte[]]@(0xC3, 0x80)
$utf8Str = [System.Text.Encoding]::UTF8.GetString($badBytes)
$bytes = [System.Text.Encoding]::ASCII.GetBytes('Write-Output "') + [byte[]]@(0xC3, 0x80) + [byte[]]@(0x22)
$path = Join-Path ([System.IO.Path]::GetTempPath()) 'encodingtest.ps1'

try
{
    [System.IO.File]::WriteAllBytes($path, $bytes)

switch (& $path)
    {
        $utf8Str
        {
            return 'UTF-8'
            break
        }

default
        {
            return 'Windows-1252'
            break
        }
    }
}
finally
{
    Remove-Item $path
}