Windows批处理/PowerShell中使用echo创建UTF-8编码文件的方法
问题原因
chcp修改代码页无效是正常的,你碰到的编码问题是PowerShell 4.0本身的默认输出规则导致的:
- PowerShell里的
echo是Write-Output的别名,用>>做重定向追加时,走的是PowerShell内部的输出编码逻辑,和控制台代码页没有关系,所以改chcp不会影响写入文件的编码 - PowerShell 4.0版本中,重定向操作符(
>/>>)和Out-File的默认编码就是UCS-2 LE BOM,和你用Notepad++查到的编码完全一致。
解决方案
根据你要的UTF-8是否带BOM选对应方法即可,绝大多数场景下读取.env配置的程序都不识别UTF-8 BOM,优先选无BOM UTF-8方案。
方案1:生成带BOM的UTF-8文件
在脚本开头先全局修改Out-File的默认编码,再执行写入操作即可:
$PSDefaultParameterValues['Out-File:Encoding'] = 'UTF8' echo MyString=Hello >> myconfig.env
也可以单条命令显式指定编码写入,不需要改全局配置:
"MyString=Hello" | Out-File myconfig.env -Encoding UTF8 -Append
方案2:生成无BOM的UTF-8文件(推荐,适配绝大多数配置读取场景)
PowerShell 4.0没有原生提供无BOM UTF8的编码参数,直接调用.NET内置的文件写入方法即可,完全绕开PowerShell自带的编码逻辑:
# 追加写入内容,末尾加Windows标准换行符 [System.IO.File]::AppendAllText( "myconfig.env", "MyString=Hello`r`n", (New-Object System.Text.UTF8Encoding $false) )
如果是覆盖写入新文件,把AppendAllText替换为WriteAllText即可。
补充说明
- 如果脚本中存在中文等非ASCII字符,请把.ps1脚本文件本身也保存为UTF-8编码,避免脚本内的字符先出现乱码
- 批量写入多行内容时,提前把所有内容拼接成完整字符串,带好换行符后一次写入即可,不需要逐行调用写入接口
- 不要在PowerShell环境里套cmd的编码逻辑处理文件写入,两套环境的编码规则完全独立,chcp只对cmd原生命令和控制台显示生效,管不到PowerShell的管道输出。
内容的提问来源于stack exchange,提问作者MaxP
相关产品推荐
相关产品推荐

