PowerShell 5如何设置输出文件为无BOM的UTF8编码?
PowerShell 5.x 输出无BOM UTF8文件解决方案
PowerShell 5.x 版本中,Out-File的utf8编码默认自带BOM,且utf8NoBOM参数是PowerShell 7及以上版本才新增的特性,因此你调用时会出现报错。以下是3种可行的实现方案:
方案1:直接调用.NET类写入(最通用)
PowerShell 5依赖的.NET Framework环境中,[System.Text.Encoding]::UTF8默认就是无BOM的UTF8编码,直接调用对应文件写入方法即可:
- 写入完整字符串内容:
# 替换为你的输出路径和合并后的内容变量 $outputPath = "C:\your\output\path.txt" $mergedContent = "你合并后的文件内容" [System.IO.File]::WriteAllText($outputPath, $mergedContent, [System.Text.Encoding]::UTF8)
- 写入行数组内容:
# $mergedLines为你合并后的行数组 [System.IO.File]::WriteAllLines($outputPath, $mergedLines, [System.Text.Encoding]::UTF8)
注意:如果使用相对路径,建议先转换为绝对路径再传给.NET方法,避免PowerShell和.NET工作目录不一致导致的写入错误,转换方法:
$outputPath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(".\相对路径.txt")
方案2:自定义兼容函数(适配原有Out-File调用习惯)
如果你原有代码中大量使用了Out-File,不想逐个修改,可以自定义无BOM UTF8输出的替代函数:
function Out-FileUtf8NoBom { param( [Parameter(Mandatory, ValueFromPipeline)] $InputObject, [Parameter(Mandatory)] [string] $FilePath, [switch] $Append ) begin { $collect = @() } process { $collect += $InputObject } end { $absolutePath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($FilePath) if ($Append -and (Test-Path $absolutePath)) { $oldContent = [System.IO.File]::ReadAllLines($absolutePath, [System.Text.Encoding]::UTF8) $collect = $oldContent + $collect } [System.IO.File]::WriteAllLines($absolutePath, $collect, [System.Text.Encoding]::UTF8) } }
后续只需把原有Out-File调用替换为Out-FileUtf8NoBom即可,兼容管道输入、追加等常用特性。
方案3:字节流写入(临时快速使用)
也可以先把内容转换为无BOM的UTF8字节流,再直接写入文件:
$mergedContent | Out-String | ForEach-Object { [System.Text.Encoding]::UTF8.GetBytes($_) } | Set-Content -Path $outputPath -Encoding Byte
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

