1

鉴于此 JSON

{"name":"//iam.googleapis.com/projects/aw-b9a-8231-4086-a297-ca0/serviceAccounts/1081069135974252","asset_type":"iam.googleapis.com/ServiceAccount","resource":{"version":"v1","discovery_document_uri":"https://iam.googleapis.com/$discovery/rest","discovery_name":"ServiceAccount","parent":"//cloudresourcemanager.googleapis.com/projects/1090951556423","data":{"email":"default@aw-d1eb6b9a-8231-4086-a297-ca0.iam.gserviceaccount.com","name":"projects/aw-d1eb6b9a-8231-4086-a297-ca0/serviceAccounts/default@aw-d1eb6b9a-8231-4086-a297-ca0.iam.gserviceaccount.com","oauth2ClientId":"108102635374252","projectId":"aw-d1eb6b9a-8231-4086-a297-ca0","uniqueId":"108108526913531974252"}},"ancestors":["projects/1090951556423","folders/940897400840","folders/140924730741","organizations/437515948226"],"update_time":"2021-02-08T18:23:18Z"}

我正在尝试使用 Windows 命令窗口中的以下代码段,

powershell -nologo -executionpolicy bypass "& {foreach($line in Get-Content temp.txt) {ConvertFrom-Json -InputObject $line}}" > temp2.txt

将检索到的键和值放入文件 (temp2.​​txt)。但是,ConvertFrom-Json 只获取 JSON 的第一个层次结构,现在在data数组中。我试过-Depth 3但得到这个错误:

At line:1 char:81
+ ... ontent temp.txt) {ConvertFrom-Json  -InputObject $line -Depth 4 -Comp ...
+                                                            ~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [ConvertFrom-Json], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.ConvertFromJsonCommand```

4

1 回答 1

2

正如Jeroen Mostert在评论中指出的那样,只有在PowerShell (Core) v6.2+ConvertFrom-Json才有-Depth参数。但是,即使您可以使用它,也不需要它也无济于事,因为它可以ConvertFrom-Json正确解析 JSON,其嵌套深度默认可达1024级别

  • 换句话说:ConvertFrom-Json -Depth $someDepth仅在您的 JSON 具有多个1024级别 的不太可能的情况需要或者如果您想确保输入 JSON 不超过给定的嵌套深度(因为超过它会导致错误- 与-Depth互补 cmdlet 的工作方式不同) , ConvertTo-Json- 见这篇文章)。

您的问题源于这样一个事实,即>PowerShell 的重定向运算符实际上是 的别名Out-File,当将复杂对象作为输入时,它会使用您在控制台中看到的相同的显示表示形式保存它们- 并使用深度嵌套的输入对象例如你的结果解释可能没有帮助(因为你的输入对象有超过 4 个顶级属性,它被隐式格式化为)。Format-List

  • 注意:您实际上使用的是cmd.exe'>运算符,但上述内容仍然适用,因为当 PowerShell 输出到外部调用者的标准输出时,也会应用相同类型的格式。

所以你要决定的问题是:

  • 您希望将什么表示保存在文件中temp2.txt

  • 您是在寻找一种用于显示的表示形式(供人类观察者使用)还是一种适合以后编程处理的格式?

如果您主要希望漂亮地打印输入 JSON,您可以使用ConvertFrom-Json/ConvertTo-Json 往返操作,默认情况下其输出将被漂亮地打印:

powershell -executionpolicy bypass -c "ConvertFrom-Json (Get-Content -Raw temp.txt) | ConvertTo-Json" > temp2.txt

笔记:

  • 正如上面所暗示的,使用ConvertTo-Json,即重新转换JSON,-Depth(在 Windows PowerShell 中也可用)更可能需要(尽管不是使用您的特定输入对象),因为默认深度仅为2,并且超过它的结果在安静的截断中(直到 PowerShell 7.0;从 v7.1 开始,至少会发出警告)-再次,请参阅这篇文章

  • powershell.exe我已经简化了您对 Windows PowerShell CLI调用的附带方面- 有关两个 PowerShell 版本中 CLI 的全面概述,请参阅此答案

  • cmd.exe考虑到使用系统的活动 OEM 代码页,您可能会遇到非 ASCII 字符的字符编码问题。从 PowerShell 命令内部保存到文件可以让您控制所需的编码。

于 2021-08-16T16:45:42.700 回答