如何阻止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
相关产品推荐
相关产品推荐

