powershell json转换问题仅在保存到变量时正确结果

kkl*_*ger 4 powershell formatting json

结果之间的 Json 转换

> $container=az container list -o json|convertfrom-json
> $container|select name,provisioningstate
Run Code Online (Sandbox Code Playgroud)

输出:

name           provisioningState
----           -----------------
master         Succeeded
pasbackground1 Succeeded
sftp           Succeeded
Run Code Online (Sandbox Code Playgroud)

没有结果之间的 Json 转换

> az container list -o json|convertfrom-json|select name,provisioningstate
Run Code Online (Sandbox Code Playgroud)

输出:

 name provisioningstate
---- -----------------
Run Code Online (Sandbox Code Playgroud)

我希望这里得到与上面相同的结果。

为什么保存临时结果会带来与在一行中指定管道命令不同的结果。

Mat*_*sen 5

默认情况下,运行时引擎在将输出提供给 dowstream cmdlet 时展开(或枚举)所有集合类型

但是,在 v6.x 之前的 PowerShell 版本中,以阻止ConvertFrom-Json运行时枚举结果的方式返回其结果- 因此管道中的下一个 cmdlet 会接收一个数组作为单个管道项。[object[]]

您可以通过多种方式解决此问题:

  • 嵌套初始管道:
(az container list -o json |ConvertFrom-Json) |Select Name,ProvisioningState
Run Code Online (Sandbox Code Playgroud)
  • 让我们ForEach-Object在返回时展开数组:
az container list -o json |ConvertFrom-Json |ForEach { $_ } |Select Name,ProvisioningState
Run Code Online (Sandbox Code Playgroud)
  • 使用中间变量(正如您已经发现的那样):
$containers = az container list -o json |ConvertFrom-Json 
$containers |Select Name,ProvisioningState
Run Code Online (Sandbox Code Playgroud)
  • 升级到较新版本的 PowerShell
    • PowerShell [Core] 7.0 中的默认行为已更改
if($PSVersionTable['PSVersion'].Major -ge 7){
  az container list -o json |ConvertFrom-Json |Select Name,ProvisioningState
}
Run Code Online (Sandbox Code Playgroud)