Я написал один сценарий JSON с вложенными массивами и пытался отобразить все данные на основе заголовка. но, к сожалению, я не мог этого сделать. Я размещаю свой код JSON и PowerShell ниже. любезно помогите мне.
Код JSON:
{
"Deploy": {
"ENV": "DIT",
"Servers": [
{
"Webservers": [
{
"Server": ["Server1","Server2"],
"site": ["website1","WebSite2"],
"VDIR": ["WebSite1","WebSite2"]
},
{
"Server": ["Server1","Server2"],
"site": ["WebSite1","WebSite2"],
"VDIR": ["WebSite1","WebSite2"]
}
]
},
{
"Winservers": [
{
"Server": ["Server1","Server2"],
"winService": ["service1","service2"]
},
{
"Server": ["Server3","Server4"],
"winService": ["service3","service4"]
}
]
}
]
}
}
Код Powershell:
$Deploy=(Get-Content D:\Deploy.json -Raw) -join "`n"|ConvertFrom-Json
foreach($i in $Deploy.Deploy.Servers) {
$s=($i | Get-Member -MemberType *property).Name
Write-host "$s" -ForegroundColor Yellow
foreach($j in $s) {
$items=($i.$j|Get-Member -MemberType *property).Name
Write-host "$items" -ForegroundColor Yellow
foreach($k in $items) {
$z=($j.$k | Get-Member -MemberType *property).Name
Write-host "$z" -ForegroundColor Yellow
}
}
}
Текущий результат:
Webservers Server site VDIR Winservers Server winService
Но ожидаемый результат должен быть таким, как показано ниже:
Webservers: Server: Sites: VDIR: list of servers list of sites list of VDIR Server: Sites: VDIR: list of servers list of sites list of VDIR Winservers: Server: services: list of servers list of sites
Пожалуйста, помогите ... Я стараюсь по-разному, но ни один из них не дал ожидаемого результата.

ОК. Думаю, твою проблему можно решить следующим образом.
$ht, $src = @{}, 'D:\sandbox\source.xml'
($srv = (Get-Content $src | ConvertFrom-Json).Deploy.Servers).ForEach{
$name = $_.PSObject.Properties.Name
$ht[$name] = $srv.$name
}
Write-Host Webservers -ForegroundColor Yellow
$ht.Webservers | Out-String
Write-Host Winservers -ForegroundColor Yellow
$ht.Winservers | Out-String
Привет, Грег, я пробовал описанным выше способом, но безуспешно. я не уверен, тестировали вы или нет. поскольку вкладка "Серверы" содержит вложенный массив. внутри каждого элемента есть вложенные массивы. следовательно, он не давал данных.
Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно как и Зачем, он решает проблему, что улучшит долгосрочную ценность ответа.
Привет, Александр, Большое спасибо за ответ. Я могу получить ожидаемые значения. но я хочу получить результат, такой как веб-серверы -> сервер (заголовок) - (список серверов), сайты (заголовок) - (список элементов, vdir (заголовок) - (список элементов), как и другие элементы. поскольку я должен использовать эти значения в разных местах моего скрипта. любезно дайте свое предложение - Спасибо, Шива
Если то, чего вы хотите добиться, - это просто форматированный вывод, возможно, это вам больше по душе.
$deploy = Get-Content 'D:\Deploy.json' -Raw | ConvertFrom-Json
Write-Host "Webservers:`r`n-----------"
$items = @()
foreach ($server in $deploy.Deploy.Servers.Webservers) {
foreach ($item in $server) {
$items += New-Object -TypeName PSObject -Property ([ordered]@{
Server = @($item.Server) -join ', '
Sites = @($item.site) -join ', '
VDIR = @($item.VDIR) -join ', '
})
}
}
$items | Out-String
Write-Host "Winservers:`r`n-----------"
$items = @()
foreach ($server in $deploy.Deploy.Servers.Winservers) {
foreach ($item in $server) {
$items += New-Object -TypeName PSObject -Property ([ordered]@{
Server = @($item.Server) -join ', '
WinService = @($item.winService) -join ', '
})
}
}
$items | Out-String
Результат будет выглядеть так:
Webservers:
-----------
Server Sites VDIR
------ ----- ----
Server1, Server2 website1, WebSite2 WebSite1, WebSite2
Server1, Server2 WebSite1, WebSite2 WebSite1, WebSite2
Winservers:
-----------
Server WinService
------ ----------
Server1, Server2 service1, service2
Server3, Server4 service3, service4
Прагматичное решение только для отображения, которое не выводит точный формат, который вы описываете, но является кратким (PSv3 +):
(Get-Content -Raw D:\Deploy.json | ConvertFrom-Json).Deploy.Servers |
ForEach-Object {
$serverTypePropName = $_.psobject.properties.Name
Write-Host "${serverTypePropName}:"
$_.$serverTypePropName | Format-Table
}
(Get-Content -Raw D:\Deploy.json | ConvertFrom-Json) преобразует ввод JSON в настраиваемые объекты.
.Deploy.Server обращается к свойству, имеющему значение массива, элементами которого являются объекты, свойства Webservers и Winservers которых, соответственно, содержат подмассивы сведений о сервере.
В блоке скрипта ForEach-Object:
$_.psobject.properties.Name извлекает имя одного свойства (Webservers или Winservers) каждого входного объекта, который содержит массив сведений о сервере.$_.$serverTypePropName | Format-Table обращается к этому свойству и отображает массив сведений о сервере в виде таблицы.
Обратите внимание, что явный использование Format-Table необходимо, потому что массивы деталей сервера имеют разные структуры свойств между Webservers и объектом Winservers; без явной команды форматирования / вывода будут отображаться только свойства массива первый.С вашим образцом ввода приведенное выше дает:
Webservers:
Server site VDIR
------ ---- ----
{Server1, Server2} {website1, WebSite2} {WebSite1, WebSite2}
{Server1, Server2} {WebSite1, WebSite2} {WebSite1, WebSite2}
Winservers:
Server winService
------ ----------
{Server1, Server2} {service1, service2}
{Server3, Server4} {service3, service4}
Позвольте мне дать вам стандартный совет для новичков: если ответ решает вашу проблему, примите его, щелкнув большую галочку (✓) рядом с ним и, при желании, проголосуйте за него (для голосования требуется 15 или более очков репутации ). Если вы нашли другие ответы полезными, проголосуйте за них. Принятие (за которое вы получите 2 очка репутации) и голосование поможет будущим читателям. См. соответствующая статья справочного центра. Если на ваш вопрос еще нет полного ответа, оставьте отзыв или самостоятельный ответ.