如何使用PowerShell捕获UTF-8编码程序的输出字符串?
解决PowerShell捕获inv.exe输出时的乱码问题
问题现象
直接在控制台调用.\inv.exe getter segments时输出正常:
.\inv.exe getter segments {28: 'Renda Fixa', 29: 'Renda Variável', ...
但用PowerShell捕获输出或转换为JSON时出现乱码:
$segmentsjson = .\inv.exe getter segments $segmentsjson {28: 'Renda Fixa', 29: 'Renda Vari�vel'.... $segmentsjson = .\inv.exe getter segments | ConvertFrom-Json $segmentsjson {"28": "Renda Fixa", "29": "Renda Vari├ível"...
已尝试以下方法但无效:
chcp 65001$OutputEncoding = [System.Text.Encoding]::UTF8[Console]::OutputEncoding = [System.Text.Encoding]::UTF8$OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding- 重定向到文件再读取:
.\inv.exe getter segments > test.txt $segmentsjson = Get-Content "test.txt" -Encoding UTF8 - 通过
Out-File保存:.\inv.exe getter segments | Out-File -FilePath "output_temp.txt" -Encoding UTF-8 - 用cmd调用并重定向:
cmd /c inv.exe getter segments > test.txt
解决方案
方法1:匹配程序的OEM输出编码
多数原生Windows程序默认使用OEM编码(如Windows-1252,取决于系统区域设置)而非UTF-8输出,PowerShell需匹配该编码才能正确捕获:
# 获取当前系统的OEM编码 $oemEncoding = [System.Text.Encoding]::GetEncoding([int] (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name OEMCP).OEMCP) # 设置PowerShell输出编码为OEM编码 $OutputEncoding = $oemEncoding # 捕获输出 $segmentsjson = .\inv.exe getter segments
方法2:字节流直接解码
若方法1无效,可直接读取程序输出的字节流,再用对应编码解码:
$oemEncoding = [System.Text.Encoding]::GetEncoding([int] (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name OEMCP).OEMCP) # 执行程序并获取字节输出 $rawBytes = & .\inv.exe getter segments # 解码为字符串 $segmentsjson = $oemEncoding.GetString($rawBytes) # 转换为JSON对象 $jsonObj = $segmentsjson | ConvertFrom-Json
方法3:修正非标准JSON格式后转码
如果程序输出的是类JSON格式(用单引号而非双引号),先转为标准JSON再处理:
$oemEncoding = [System.Text.Encoding]::GetEncoding([int] (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name OEMCP).OEMCP) $rawOutput = $oemEncoding.GetString(& .\inv.exe getter segments) # 替换单引号为双引号,转为标准JSON $standardJson = $rawOutput -replace "'", '"' $jsonObj = $standardJson | ConvertFrom-Json
原理说明
原生Windows控制台程序的输出编码通常与系统OEM编码绑定,而PowerShell默认编码不匹配时就会出现乱码。通过强制对齐编码,就能正确解析特殊字符。
内容的提问来源于stack exchange,提问作者LegsNotHand
相关产品推荐
相关产品推荐

