Результат PowerShell «$ g = $ json | ConvertFrom-Json | Состояние группы» отличается от «$ g = $ json | ConvertFrom-Json; $ g = $ g | Состояние группы;»

#powershell

#powershell

Вопрос:

Приведенные ниже результаты test2 и test3 отличаются.
Меня это смущает, потому что это похоже на ту же логику и отличается от || логики linux bash.

 $data = @(
    [PSCustomObject]@{State="TAIPEI";Type="1"}
    [PSCustomObject]@{State="TAIPEI";Type="2"}
    [PSCustomObject]@{State="KH";Type="3"}
    [PSCustomObject]@{State="KH";Type="4"}
    [PSCustomObject]@{State="KH";Type="5"}
    [PSCustomObject]@{State="TX";Type="6"}
    [PSCustomObject]@{State="TX";Type="7"}
)

$json = $data | ConvertTo-Json ;

# test1
$g = $data | Group State;
Write-Host($g.Length); #result : 3

# test2
$g = $json | ConvertFrom-Json | Group State ;
Write-Host($g.Length); #result : 1 

# test3
$g = $json | ConvertFrom-Json ;
$g = $g | Group State ;
Write-Host($g.Length); #result : 3 
  

Попробуйте это онлайн!

Что я пробовал:
я использую режим отладки vscode, проверяю переменную

test1 это [Object[3]] и 3 GroupInfo изображение

test2 становится коллекцией изображение

test3 это [Object[3]] и 3 GroupInfo изображение

Ответ №1:

Я впервые попробовал ваш пример в Powershell 7, но не смог воспроизвести ваши результаты, все вело себя так, как ожидалось. Так что, похоже, это поведение ограничено Powershell 5.

Глядя на то, что выводится ConvertFrom-Json в двух версиях, вы можете увидеть, что происходит:

В Powershell 7:

    # ~>  $json | ConvertFrom-Json | get-member

   TypeName: System.Management.Automation.PSCustomObject
  

В Powershell 5.1:

 # ~> $json | ConvertFrom-Json | Get-Member

   TypeName: System.Object[]
  

Похоже, что в Powershell 5.1 ConvertFrom-Json не выводятся PSCustomObject данные, которые Group-Object должны функционировать должным образом. Я нашел простой обходной путь для преобразования выходных данных ConvertFrom-Json в PSCustomObject рабочие:

 # ~> $g = $json | ConvertFrom-Json | %{[PsCustomObject]$_} | group state
# ~> $g

Count Name                      Group
----- ----                      -----
    2 TAIPEI                    {@{State=TAIPEI; Type=1}, @{State=TAIPEI; Type=2}}
    3 KH                        {@{State=KH; Type=3}, @{State=KH; Type=4}, @{State=KH; Type=5}}
    2 TX                        {@{State=TX; Type=6}, @{State=TX; Type=7}}
  

Или вы можете просто перейти к Powershell 7.