使用PowerShell导出对象为JSON时文件开头出现异常字符问题
你遇到的JSON文件开头异常字符是UTF-16 LE(小端序)的字节顺序标记(BOM),由PowerShell的Out-File cmdlet默认编码规则导致,具体逻辑如下:
- PowerShell 5.1及更早版本中,
Out-File的默认输出编码为UTF-16 LE(系统标注为"Unicode"编码),写入文件时会自动在内容开头添加对应编码的BOM(值为0xFF 0xFE,也就是你看到的两个乱码字符)。 ConvertTo-Json输出的是纯UTF-8格式的字符串内容,但经过Out-File时会被强制重新转码为UTF-16 LE并添加BOM,Node.js默认按UTF-8编码读取文件时无法识别该BOM,就会报JSON解析错误。
修复方案
- 如果你使用PowerShell 7及以上版本,直接给
Out-File指定无BOM的UTF-8编码即可:
$eventStartList | ConvertTo-Json | Out-File 'C:\scheduledEventStart.json' -Encoding utf8NoBOM
- 如果你使用PowerShell 5.1版本,没有内置的utf8NoBOM参数,可以调用.NET的文件写入方法实现无BOM的UTF-8输出:
$jsonContent = $eventStartList | ConvertTo-Json [System.IO.File]::WriteAllText('C:\scheduledEventStart.json', $jsonContent, [System.Text.Encoding]::UTF8)
额外优化建议
你当前读取JSON的逻辑遇到空文件时会触发ConvertFrom-Json报错,可以加个非空判断避免异常:
$eventPath = 'C:\scheduledEventStart.json' [System.Collections.ArrayList]$eventStartList =@() if (Test-Path $eventPath) { $rawContent = Get-Content $eventPath -Raw if (-not [string]::IsNullOrWhiteSpace($rawContent)) { $EventStart = $rawContent | ConvertFrom-Json $eventStartList += $EventStart } }
内容的提问来源于stack exchange,提问作者Dean Egan
相关产品推荐
相关产品推荐

