【问题标题】:Issue with PowerShell ConvertTo-Json adding un-printable characters to beginning of filePowerShell ConvertTo-Json 将不可打印字符添加到文件开头的问题
【发布时间】:2022-08-11 00:55:47
【问题描述】:

我在使用 PowerShell ConvertTo-Json 命令时遇到问题。生成的文件有两个不可打印字符作为文件的第一个 to 字符。使用 Format-Hex,返回值为:

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   FF FE 5B 00 0D 00 0A 00 20 00 20 00 20 00 20 00  .þ[..... . . . .
00000010   7B 00 0D 00 0A 00 20 00 20 00 20 00 20 00 20 00  {..... . . . . .
...

坏字符是 00 和 01 位置的 FF 和 FE。我用来生成文件的命令如下:

$search.resources.attributes |select $Object.Attributes.ID  |Sort-Object -Property displayname | ConvertTo-Json | Out-File  ([Environment]::GetFolderPath(\"Desktop\")+\"\\RL_Identities.json\")

$search 是 Invoke-RestMethod 调用的结果。

我正在将此文件导入 Oracle CLOB 列。此列有一个 CHECK (COLUMN_NAME IS JSON) 检查约束,并且文件中包含两个不可打印的字符而失败。如果我在 Notepad++ 中打开文件,选择全部并复制/粘贴到一个新文件,新文件会完美加载,因为它开头没有两个字符。

这两个角色有什么原因吗?它是 ConvertTo-Json 命令的“功能”还是来自 Invoke-RestMethod 调用中的数据?如果没有办法阻止这些字符存在,有没有办法以编程方式删除文件的前两个字节?

  • 输出文件默认为 utf 16 编码。 OF FE 是编码 sig 或 BOM。

标签: powershell convertto-json


【解决方案1】:

您的文件使用“Unicode”(UTF-16LE)字符编码,这是您在使用 > / Out-File 时在 Windows PowerShell 中默认获得的内容。

  • 前两个字节FFFE 组成了所谓的BOM (byte-order mark),也就是Unicode 签名,用于标识编码。

相反,使用Set-Content(或-Out-File)和-Encoding 参数来指定所需的编码。

需要注意的是,如果您需要 UTF-8,Windows PowerShell 中的-Encoding utf8 会创建 UTF-8 文件带有 BOM,并非所有消费者都明白。

  • PowerShell (Core) 7+,相比之下,你得到物料清单-较少的UTF-8默认, 在所有 cmdlet 中(因此也适用于 >)。

如果你在Windows PowerShell并且需要创建一个 BOM-较少的UTF-8 文件,您可以通过New-Item 使用以下解决方法:

# Creates out.txt with BOM-less UTF-8 encoding.
# Note that the -Value argument must be a single, potentially multi-line
# string and a trailing newline is NOT added.
New-Item -Force out.txt -Value (
  ConvertTo-Json 'hü'
)

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 2015-05-25
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多