如何解决PowerShell与外部程序管道交互时的编码问题?
解决PowerShell中非拉丁字符编码乱码问题
一、ffprobe输出乱码修复
问题核心是外部命令(ffprobe)的输出编码与PowerShell解码外部输出的编码不匹配:
- 单独运行ffprobe时,控制台直接用系统OEM编码(中文系统为GBK)显示,所以正常;
- 管道到PowerShell时,PowerShell用
[Console]::OutputEncoding解码输出,若该编码与ffprobe输出编码不一致,就会出现乱码。
解决方案1:匹配解码编码
将[Console]::OutputEncoding设置为ffprobe的输出编码(中文Windows下为GBK):
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("GBK") # 之后再执行命令即可正常解码 ffprobe $filename 2>&1 | Out-String
解决方案2:强制ffprobe输出UTF8
让ffprobe直接输出UTF8编码,此时保持[Console]::OutputEncoding为UTF8即可:
# 部分ffprobe版本需指定-print_format确保编码生效 ffprobe -encoding utf-8 -print_format default $filename 2>&1 | Out-String
二、脚本运行乱码修复
问题根源是脚本文件的保存编码不正确:
- 直接在控制台执行命令时,字符串由PowerShell内部以Unicode处理,显示正常;
- 脚本文件若保存为ANSI编码(如GBK),PowerShell默认用系统ANSI编码读取,非ANSI字符会解码错误。
解决方案1:保存脚本为UTF-8带BOM
使用文本编辑器(如VS Code、Notepad++)将脚本保存为UTF-8带BOM格式,PowerShell(尤其是Windows PowerShell)会自动识别并正确解码。
解决方案2:执行时指定编码读取脚本
若无法修改脚本保存编码,可通过指定编码读取并执行:
Get-Content .\test.ps1 -Encoding UTF8 | Invoke-Expression
解决方案3:添加编码声明
在脚本开头添加编码声明(适用于PowerShell 5.1及以上版本):
#Requires -Version 5.1 <# encoding: utf-8 #> Write-Output 'Non-latin characters like Cyrillic (Д, Ц); CJK characters (本, 화, が).'
关键编码变量说明
$OutputEncoding:仅控制PowerShell向外部命令输出数据时的编码,与外部命令向PowerShell的输入解码无关。[Console]::OutputEncoding:控制PowerShell解码外部命令输出时使用的编码,是处理外部命令乱码的核心变量。
内容的提问来源于stack exchange,提问作者ZR Han
相关产品推荐
相关产品推荐

