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

如何阻止Start-Transcript在日语字符后插入NULL(0x00)字符?

解决Start-Transcript插入NULL字符的问题

可行解决方案

1. 直接捕获输出替代Start-Transcript

绕过Start-Transcript的编码问题,直接将命令输出和脚本日志写入文件,精准控制编码:

# 初始化日志文件(覆盖原有内容)
"脚本执行开始:$(Get-Date)" | Out-File -FilePath "script_log.txt" -Encoding UTF8

# 执行目标命令并追加输出
pktmon etl2txt | Out-File -FilePath "script_log.txt" -Encoding UTF8 -Append

# 追加结束日志
"脚本执行结束:$(Get-Date)" | Out-File -FilePath "script_log.txt" -Encoding UTF8 -Append

这种方式完全避免Start-Transcript的编码转换bug,同时保留完整的输出内容。

2. 后期清理转录文件中的NULL字符

如果必须使用Start-Transcript,可以在转录完成后批量移除文件中的0x00字符:

# 读取原始转录文件
$rawContent = Get-Content -Path "transcript.txt" -Raw
# 移除所有NULL字符
$cleanedContent = $rawContent -replace "`0", ""
# 保存清理后的内容
Set-Content -Path "cleaned_transcript.txt" -Value $cleanedContent -Encoding UTF8

根据补充信息,只有日语字符后存在冗余NULL,因此该操作不会破坏有效内容。

3. 临时调整控制台编码

部分外部命令的输出编码是UTF-16LE,和PowerShell的默认编码不兼容导致问题。可以临时切换控制台为UTF-8编码后再执行转录:

# 切换控制台编码为UTF-8(65001),屏蔽chcp命令的输出
chcp 65001 > $null

Start-Transcript -Path "transcript_utf8.txt"
pktmon etl2txt
Stop-Transcript

# 可选:恢复原控制台编码(日语系统默认是932)
chcp 932 > $null

该方法通过统一编码减少转换过程中的错误,部分场景下可以直接避免NULL字符插入。

问题根源

Start-Transcript在处理外部命令的双字节字符输出时,存在编码转换逻辑缺陷:若外部命令以UTF-16LE编码输出内容,转录模块在转换为UTF-8时错误保留了双字节字符后的冗余NULL字节;而PowerShell自身生成的页眉、页脚是直接以UTF-8处理的,因此没有该问题。

内容的提问来源于stack exchange,提问作者SATO Yusuke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:28:11