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

如何避免PowerShell流输出写入文件时出现非预期的额外字符

问题原因

你遇到的转换是PowerShell默认文本输出机制的固有默认行为:

  • 重定向操作符>是Out-File cmdlet的语法糖,默认使用*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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:42:05