Sehr Anfängerfrage. Ich versuche, mit Powershell bestimmte Werte von JSON abzurufen. Insbesondere möchte ich die Dienste auflisten: TEST00000 und FÄLSCHUNG nur.
Wenn ich das folgende Skript ausführe, erhalte ich Folgendes:
TEST00000 FAKE
--------- ----
@{Enabled=True; Processed=2; Sent=3; Failed=4; Downloaded=5} @{Enabled=True}
Wie kann ich nur eine Liste der Dienste erhalten?
Noch wichtiger ist, wie liste ich nur die Dienste auf, die den Schlüssel / Wert haben Aktiviert = Wahr in ihnen vorhanden?
Hier ist der Code:
$JSON = "{
"Envs": {
"DEV": {
"Services": {
"TEST00000": {
"Enabled": true,
"Processed": 2,
"Sent": 3,
"Failed": 4,
"Downloaded": 5
},
"FAKE": {
"Enabled": true
}
}
}
},
"Component": {
"Digger": {
"Envs": {
"DEV": {
"DownloadE": 4
}
}
}
}
}"
$jsonobj = ConvertFrom-Json -inputObject $JSON
$jsonobj.Envs.DEV.Services
Antworten:
3 für die Antwort № 1Um den Namen von jedem zu bekommen Services
Eigentum. Sie können verwenden Get-Member
wie user2734259 oder Sie können die verwenden psobject
Eigenschaft, die nützliche Informationen zu einem Objekt speichert.
$ServiceNames = $jsonobj.Envs.DEV.Services.psobject.properties.name
Sobald Sie die Namen haben, können Sie sie durchlaufen und nach der Untereigenschaft filtern Enabled
$jsonobj.Envs.DEV.Services.psobject.properties.name | ForEach-Object {
$_ | Where-Object {$jsonobj.Envs.DEV.Services.$_.Enabled -eq $True}
}
1 für die Antwort № 2
Auf diese Weise können Sie die Namen unabhängig vom Dienstnamen in Ihrem JSON dynamisch abrufen:
$JSON = "{
"Envs": {
"DEV": {
"Services": {
"TEST00000": {
"Enabled": true,
"Processed": 2,
"Sent": 3,
"Failed": 4,
"Downloaded": 5
},
"FAKE": {
"Enabled": true
}
}
}
},
"Component": {
"Digger": {
"Envs": {
"DEV": {
"DownloadE": 4
}
}
}
}
}"
$jsonobj = ConvertFrom-Json -inputObject $JSON
$enabledServices = $NULL
$disabledServices = $NULL
# Since the service names are arbitrary
# create an object that contains only
# objects whose MemberType is NoteProperty
$strServiceNames = @($($jsonobj.Envs.DEV.Services | Get-Member | Where { $_.MemberType -eq "NoteProperty" } | Select Name).Name)
$pscoServiceNames = [PSCustomObject]@{Names=$strServiceNames}
foreach($serviceName in $pscoserviceNames.Names)
{
# dynamically access the service name
# from $jsonobj.Envs.DEV.Services
$serviceStatus = $jsonobj.Envs.DEV.Services.$serviceName.Enabled
# parse results based on value of .Enabled
if($serviceStatus.ToString() -eq "True")
{
$enabledServices = [Array]$enabledServices + [PSCustomObject]@{Name = $serviceName;Enabled = $serviceStatus}
}
else
{
$disabledServices = [Array]$disabledServices + [PSCustomObject]@{Name = $serviceName;Enabled = $serviceStatus}
}
}
# Show the results
Write-Output "`nEnabled Services`n"
$enabledServices | Format-List
Write-Output "`nDisabled Services`n"
$disabledServices | Format-List
Wenn etwas unklar ist, lass es mich wissen und ich kann es genauer erklären Hoffe das hilft dir weiter. Happy "Beschuss!