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

PowerShell Tee-Object编码问题:如何恢复日志新增乱码内容

恢复PowerShell 7.3中Tee-Object写入的乱码日志数据

问题原因

PowerShell 5.1的Tee-Object默认使用系统ANSI编码(中文系统通常为GBK/GB2312),而PowerShell 7+默认改用UTF-8无BOM编码。当在PS7中追加写入原ANSI编码的日志文件时,新增内容以UTF-8无BOM存储,但用默认ANSI编码读取时就会显示乱码。

恢复方法

方法1:文本编辑器直接恢复(最简单)

  1. 复制日志文件做备份,避免操作失误。
  2. 用Notepad++打开备份文件:
    • 点击顶部菜单栏「编码」,选择「UTF-8无BOM」,此时新增的乱码内容会显示正常,原有ANSI内容可能出现乱码。
    • 选中并复制所有正常显示的新增内容。
  3. 打开原始的正常日志文件(或备份中原有内容正常的版本),粘贴复制的新增内容到末尾。
  4. 将合并后的文件保存为统一编码(比如「UTF-8」或「ANSI」)。

方法2:PowerShell脚本批量恢复

如果日志文件较大,可通过PowerShell 7执行以下命令:

# 替换为你的日志文件路径
$logPath = "C:\path\to\your\log.log"
# 替换为原有日志的最后一行内容(用于定位新增内容的起始位置)
$lastValidLine = "原有日志的最后一行内容"

# 读取原有ANSI编码的内容(中文系统用GBK,其他系统可换成对应ANSI编码)
$oldContent = Get-Content -Path $logPath -Encoding GBK
# 定位新增内容的起始索引
$splitPos = $oldContent.IndexOf($lastValidLine) + 1

# 以UTF-8无BOM读取整个文件的原始内容,拆分出新增部分
$rawFullContent = Get-Content -Path $logPath -Raw -Encoding UTF8
$recoveredNewContent = ($rawFullContent -split [regex]::Escape($lastValidLine), 2)[1].Trim()

# 合并原有内容与恢复的新增内容,保存为UTF-8编码的新文件
$oldContent + $recoveredNewContent | Set-Content -Path "C:\path\to\recovered_log.log" -Encoding UTF8

后续预防措施

修改你的PowerShell脚本,给Tee-Object指定与PS5.1一致的编码,避免再次出现乱码:

# 中文系统指定GBK编码,与PS5.1默认行为一致
your-command | Tee-Object -FilePath "log.log" -Append -Encoding GBK

# 或者使用系统默认ANSI编码(跨系统需注意兼容性)
your-command | Tee-Object -FilePath "log.log" -Append -Encoding Default

内容的提问来源于stack exchange,提问作者Jerkle Berry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:12:20