如何避免PowerShell流输出写入文件时出现非预期的额外字符
问题原因
你遇到的转换是PowerShell默认文本输出机制的固有默认行为:
- 重定向操作符
>是Out-Filecmdlet的语法糖,默认使用*UTF-16LE(Unicode)*编码存储文本:- 开头的
ff fe是UTF-16LE的字节序标记(BOM) - 每个字符后插入的
00是UTF-16LE双字节存储ASCII字符的特征
- 开头的
- 默认所有文本输出cmdlet都会在内容末尾自动追加换行符
\r\n
解决方案
场景1:写入纯文本,精准控制编码和换行
使用Set-Content cmdlet显式指定参数即可避免默认转换:
- 用
-Encoding参数指定编码,比如ASCII对应-Encoding Ascii,UTF-8无BOM(PowerShell 7+)对应-Encoding utf8NoBOM - 用
-NoNewline参数取消末尾自动追加的换行符
示例(实现写入abc三个ASCII字节的需求):
Set-Content -Path /test.txt -Value 'abc' -Encoding Ascii -NoNewline
场景2:写入原始二进制内容,完全避免编码转换
如果需要写入纯字节流,不要使用任何文本处理类cmdlet,直接调用.NET的文件写入方法,不会产生任何额外转换:
# 定义要写入的字节数组 $byteContent = [byte[]]@(0x61, 0x62, 0x63) # 直接写入字节到文件 [System.IO.File]::WriteAllBytes('/test.txt', $byteContent)
PowerShell 5.1写入UTF-8无BOM文本的兼容方案
PowerShell 5.1的Set-Content没有utf8NoBOM编码选项,直接用.NET方法更可靠:
[System.IO.File]::WriteAllText('/test.txt', 'abc', [System.Text.Encoding]::UTF8)
.NET的UTF8编码默认不带BOM,完全符合预期。
内容的提问来源于stack exchange,提问作者Gershom Maes
相关产品推荐
相关产品推荐

