在使用 PowerShell 的 `Set-Content` 命令时,很多用户发现默认保存的 UTF-8 文件会带有 BOM(字节顺序标记),这在某些应用场景(如 JSON、前端构建工具等)中会导致解析错误或警告。因此,一个常见的技术问题是:
**如何使用 PowerShell 的 Set-Content 命令保存为 UTF-8 编码且不带 BOM 的文本文件?**
该问题不仅涉及编码设置,还关系到不同 PowerShell 版本对字符编码处理方式的差异,是自动化脚本和配置管理中常遇到的痛点之一。解决此问题有助于提升脚本输出文件的兼容性和稳定性。
1条回答 默认 最新
风扇爱好者 2025-07-04 14:15关注一、问题背景与技术痛点
在使用 PowerShell 编写自动化脚本时,开发者经常需要将文本内容输出到文件中。PowerShell 提供了
Set-Content命令用于向文件写入内容。然而,很多用户发现:默认情况下,Set-Content保存的 UTF-8 文件会带有 BOM(Byte Order Mark),即字节顺序标记。BOM 是一个特殊的 Unicode 字符(U+FEFF),位于文件开头,用于标识编码格式。虽然对某些编辑器和工具友好,但在处理 JSON 文件、前端构建工具(如 Webpack、Vite)、YAML 配置文件等场景中,BOM 可能导致解析错误或警告,从而影响系统的稳定性。
应用场景 可能的问题表现 JSON 文件 解析失败,报错“Unexpected token \uFEFF” 前端构建工具 构建过程出现异常或警告 API 接口调用 响应数据包含不可见字符导致解析失败 二、PowerShell 版本差异分析
不同版本的 PowerShell 对字符编码的处理方式存在差异:
- PowerShell 5.1 及更早版本:
Set-Content默认使用 ASCII 或 UTF-8 with BOM 编码。 - PowerShell 7.x 及以上版本(基于 .NET Core):
Set-Content默认使用 UTF-8 without BOM。
这意味着,在跨平台或混合环境中编写脚本时,如果不统一指定编码方式,可能会导致输出文件的行为不一致。
三、解决方案详解
方法一:使用
-Encoding参数(适用于 PowerShell 7.x)"Hello, World!" | Set-Content -Path "output.txt" -Encoding utf8PowerShell 7.x 中
-Encoding utf8表示无 BOM 的 UTF-8 编码;而utf8Bom则表示带 BOM。方法二:自定义编码方式(适用于 PowerShell 5.1)
$Utf8NoBom = New-Object System.Text.UTF8Encoding $False "Hello, World!" | Out-File -FilePath "output.txt" -Encoding $Utf8NoBom由于
Set-Content在 PowerShell 5.1 中不支持直接指定无 BOM 的 UTF-8,因此可以借助Out-File并传入自定义编码对象实现。方法三:封装函数统一接口
function Write-Utf8NoBom { param ( [string]$Path, [string]$Content ) $Utf8NoBom = New-Object System.Text.UTF8Encoding $False $StreamWriter = New-Object System.IO.StreamWriter($Path, $False, $Utf8NoBom) $StreamWriter.Write($Content) $StreamWriter.Close() } Write-Utf8NoBom -Path "output.txt" -Content "Hello, World!"通过封装为函数,可以在任何 PowerShell 环境下统一调用方式,提升脚本可维护性。
四、流程图:选择合适的编码方案
```mermaid graph TD A[开始] --> B{PowerShell版本 >= 7.x?} B -- 是 --> C[使用 Set-Content -Encoding utf8] B -- 否 --> D[使用 Out-File + 自定义编码对象] D --> E[或封装 StreamWriter 函数] ```五、最佳实践建议
- 始终显式指定编码方式,避免依赖默认行为。
- 在多环境部署脚本前,验证输出文件是否含 BOM。
- 使用
Get-Content -Raw -Encoding Byte检查文件开头是否含有 BOM 字节(EF BB BF)。 - 对于 CI/CD 流水线中的脚本,推荐使用 PowerShell 7.x 以获得更一致的编码支持。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- PowerShell 5.1 及更早版本: