PowerShell 5.1中Out-File追加内容乱码问题及解决验证
PowerShell 5.1中Out-File追加乱码的原理与规范实现
乱码根源:编码不匹配与命令行为差异
1. PowerShell 5.1的默认编码规则
Out-File(包括-Append模式)的默认编码是Unicode(UTF-16 LE),不管目标文件原有编码是什么,只要不手动指定-Encoding参数,就会用UTF-16 LE写入内容。Add-Content的行为不同:它会自动检测目标文件的现有编码,然后用相同编码追加内容,无需手动指定编码也能匹配原文件格式。
2. 场景中的具体问题
你用Out-File -Encoding utf8创建的是带BOM的UTF-8文件(PowerShell 5.1中-Encoding utf8默认生成带BOM的UTF-8)。当直接用Out-File -Append追加时,命令会用默认的UTF-16 LE编码写入内容——两种编码的字节流混合后,文本编辑器无法正确解析:
- 记事本会把UTF-16的双字节字符拆成单个字节显示,出现字符间隔;
- VS Code则因编码不匹配,无法识别内容,显示为空值。
而Add-Content能正常追加,正是因为它自动识别了原文件的UTF-8编码,用相同格式写入内容。
规范实现方式
根据需求选择以下任意一种方式:
方式一:统一为Out-File指定编码
创建和追加时都明确指定-Encoding参数,确保编码一致:
# 创建带BOM的UTF-8文件 "初始内容" | Out-File -Path "test.txt" -Encoding utf8 # 追加时使用相同编码 "追加内容" | Out-File -Path "test.txt" -Append -Encoding utf8
如果需要无BOM的UTF-8(PowerShell 5.1需Windows 10 1809/Server 2019及以上版本支持),可替换为-Encoding utf8NoBOM。
方式二:全程使用Add-Content
利用Add-Content自动检测编码的特性,创建和追加都用它:
# 创建无BOM的UTF-8文件(默认行为) "初始内容" | Add-Content -Path "test.txt" # 追加时自动匹配编码 "追加内容" | Add-Content -Path "test.txt"
若需要带BOM的UTF-8,创建时指定编码即可:
"初始内容" | Add-Content -Path "test.txt" -Encoding utf8 "追加内容" | Add-Content -Path "test.txt"
方式三:Set-Content + Add-Content组合
用Set-Content创建文件时指定编码,追加用Add-Content自动匹配:
# 创建带BOM的UTF-8文件 "初始内容" | Set-Content -Path "test.txt" -Encoding utf8 # 追加内容,自动匹配编码 "追加内容" | Add-Content -Path "test.txt"
内容的提问来源于stack exchange,提问作者YorSubs
相关产品推荐
相关产品推荐

