#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.