You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:45:24