Domanda molto principiante. Sto cercando di ottenere determinati valori da JSON con Powershell. In particolare, voglio elencare i servizi: TEST00000 e FALSO solo.
Quando eseguo lo script di seguito, ottengo questo:
TEST00000 FAKE
--------- ----
@{Enabled=True; Processed=2; Sent=3; Failed=4; Downloaded=5} @{Enabled=True}
Come posso ottenere un elenco di solo i servizi?
Ancora più importante, come faccio a elencare solo i servizi che hanno la chiave / valore Enabled = True presente dentro di loro?
Ecco il codice:
$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
risposte:
3 per risposta № 1Per ottenere il nome di ciascuno Services
proprietà. Puoi usare Get-Member
come user2734259 ha fatto o è possibile utilizzare il psobject
proprietà che memorizza informazioni utili su un oggetto.
$ServiceNames = $jsonobj.Envs.DEV.Services.psobject.properties.name
Una volta che hai i nomi puoi passarli sopra e filtrarli sulla proprietà secondaria Enabled
$jsonobj.Envs.DEV.Services.psobject.properties.name | ForEach-Object {
$_ | Where-Object {$jsonobj.Envs.DEV.Services.$_.Enabled -eq $True}
}
1 per risposta № 2
Questo dovrebbe consentire di ottenere i nomi dinamicamente, indipendentemente dal nome del servizio nel tuo JSON:
$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
Se qualcosa non è chiaro fammelo sapere e posso spiegarlo in modo più dettagliato Spero che questo ti aiuti. Felice "bombardamento!