使用 Powershell 读取 JSON 层次结构(子节点数可以是任意数字)文件
Reading the JSON hierarchy (Number of subnodes can be any number) file using Powershell
正在使用 Powershell 读取 JSON 层次结构(子节点数可以是任意数字)文件。
我可以在一个级别上执行此操作,但 N 个循环和嵌套循环需要相同的级别
需要树视图中的结果,如果不可能,则采用表格方式,标题位于根 table
之上
下面是我目前开发的脚本:
$Filepath = 'C:\Users\Learner\Test2.JSON'
$JsonContent=gc $Filepath | ConvertFrom-Json
$RootNodeCount=$JsonContent.psobject.Properties.name.Count
$RootNodeName=$JsonContent.psobject.Properties.name
foreach ($Name in $RootNodeName) {Echo $Name--> $JsonContent.$Name}
JSON 文件
{
"foundation": {
"network": {
"resource_group_name": "rg-network-e2",
"name": "nonprodvnet-e2"
},
"diagnostics": {
"resource_group_name": "rg-mgmt-cu",
"storage_account_name": "Sreacnt-e2"
},
"log_analytics": {
"resource_group_name": "rg-mgmt-cu",
"workspace_name": "la-sap-e2"
},
"recovery_vault": {
"resource_group_name": "rg-mgmt-cu",
"name": "rsv-sap-e2"
},
"windows_domain": {
"domain_name": "dmn.local",
"ou_path": "CN=Computers,DC=example,DC=com",
"domain_user": "svc_domainjoin@dmn.local",
"domain_password": "Pwd01"
}
},
"control_flags": {
"enable_boot_diagnostics": true,
"enable_oms": false,
"enable_backup": true,
"windows_domain_join": false
},
"deployment": {
"resource_group": {
"name": "rg-sap-501-e2",
"location": "eastus2"
},
"tags": {
"owner": "for SAP"
},
"os_account": {
"admin_username": "locadm"
},
"proximity_placement_groups": {
"ppg-501": {}
},
"availability_sets": {
"avset-cs-501": {
"ppg_name": "ppg-501"
},
"avset-app-501": {
"ppg_name": "ppg-501"
},
"avset-db-501": {
"ppg_name": "ppg-501"
}
},
"load_balancers": {
"ilb-sap-501": {
"dv2ascs": {
"ip_address": "192.0.18.20",
"probe_port": 62000,
"subnet": "app"
},
"dv2-ers": {
"ip_address": "192.0.18.21",
"probe_port": 62102,
"subnet": "app"
}
},
"ilb-db-501": {
"dv2-hana": {
"ip_address": "192.0.17.12",
"probe_port": 62503,
"subnet": "db"
}
}
},
"server_groups": {
"ascs": {
"os_type": "linux",
"sku": "Standard_E4s_v3",
"availability_set": "avset-cs-501",
"backup_policy": "sap",
"ppg_name": "ppg-501",
"lb_refs": [
"dv2-ascs",
"dv2-ers"
],
"os_disk_size": "30",
"enable_accelerated_networking": true,
"hosts": {
"vcs501-01": {
"nics": [
[
"192.0.18.18"
]
]
},
"vcs501-02": {
"nics": [
[
"192.0.18.19"
]
]
}
},
"subnet": "app",
"image_details": {
"resource_id": null,
"marketplace_reference": {
"publisher" : "SUSE",
"offer" : "sles-sap-15-sp1",
"sku" : "gen1",
"version": "latest"
}
},
"disks": [
{
"name": "usrsap",
"disk_size": "128",
"number_of_disks": 1
}
]
},
"apps": {
"type": "app_linux",
"os_type": "linux",
"sku": "Standard_E4s_v3",
"availability_set": "avset-app-501",
"backup_policy": "sap",
"ppg_name": "ppg-501",
"enable_accelerated_networking": true,
"os_disk_size": "30",
"hosts": {
"vas501-01": {
"nics": [
[
"192.0.18.16",
"192.0.18.26"
]
]
},
"vas501-02": {
"nics": [
[
"192.0.18.17",
"192.0.18.27"
]
]
}
},
"subnet": "app",
"image_details": {
"resource_id": null,
"marketplace_reference": {
"publisher" : "SUSE",
"offer" : "sles-15-sp1",
"sku" : "gen1",
"version": "latest"
}
},
"disks": [
{
"name": "usrsap",
"disk_size": "128",
"number_of_disks": 1
}
]
},
"hana": {
"os_type": "linux",
"sku": "Standard_E32s_v3",
"availability_set": "avset-db-501",
"backup_policy": "sap",
"ppg_name": "ppg-501",
"os_disk_size": "30",
"subnet": "db",
"lb_refs": [
"dv2-hana"
],
"hosts": {
"vhs501-01": {
"nics": [
[
"192.0.17.10"
]
]
},
"vhs501-02": {
"nics": [
[
"192.0.17.11"
]
]
}
},
"image_details": {
"resource_id": null,
"marketplace_reference": {
"publisher" : "SUSE",
"offer" : "sles-sap-15-sp1",
"sku" : "gen1",
"version": "latest"
}
},
"disks": [
{
"name": "usrsap",
"disk_size": "128",
"number_of_disks": 1
},
{
"name": "hanashared",
"disk_size": "128",
"number_of_disks": 1
},
{
"name": "hanadata",
"disk_size": "128",
"number_of_disks": 3
},
{
"name": "hanalog",
"disk_size": "128",
"number_of_disks": 2
},
{
"name": "hanabackup",
"disk_size": "512",
"number_of_disks": 1
}
]
}
}
}
}
您并不是真正在阅读 Json
文件,而是实际上是 PowerShell object 的层次结构,它可能包含很多 (.Net) object 类型,但在这种情况下它受限于原来的 Json 结构,它只包含三种主要类型:
- 数组,包含多个child objects
- PSCustomObjects (unless you use the
ConvertFrom-Json -AsHashTable
参数),包含分配给特定名称的 child object。
- Primitives(包括字符串),它基本上是一个没有 children.[=45 的 object ("leaf") =]
阅读未知深度的层次结构的最佳方法是使用 recursive
函数,即调用自身的函数。为您的具体问题举个例子:
Function Show-Object ($Object, $Depth = 0, $Name) {
$Indent = if ($Depth++) { " " * ($Depth - 2) }
if ($Object -is [Array]) {
If ($Name) { "$Indent$Name =" }
foreach ($Item in $Object) {
Show-Object $Item $Depth
}
}
elseif ($Object -is [PSCustomObject]) {
If ($Name) { "$Indent$Name =" }
foreach ($Name in $Object.PSObject.Properties.Name) {
Show-Object $Object.$Name $Depth $Name
}
}
else {
if ($Name) { "$Indent$Name = $Object" } else { "$Indent$Object" }
}
}
如您所见,结构可能是 child object(在 [Array]
或 [PSCustomObject]
的情况下),Show-Object
函数使用 child object 作为新输入 object 和一些附加参数调用自身,例如跟踪当前 $Depth
.
您可以像这样简单地调用该函数:
Show-Object $JsonContent
或将其导出到如下文件:
Show-Object $JsonContent | Out-File .\text1.txt
对于您的 $JsonContent
它将导致:
foundation =
network =
resource_group_name = rg-network-e2
name = nonprodvnet-e2
diagnostics =
resource_group_name = rg-mgmt-cu
storage_account_name = Sreacnt-e2
log_analytics =
resource_group_name = rg-mgmt-cu
workspace_name = la-sap-e2
recovery_vault =
resource_group_name = rg-mgmt-cu
name = rsv-sap-e2
windows_domain =
domain_name = dmn.local
ou_path = CN=Computers,DC=example,DC=com
domain_user = svc_domainjoin@dmn.local
domain_password = Pwd01
control_flags =
enable_boot_diagnostics = True
enable_oms = False
enable_backup = True
windows_domain_join = False
deployment =
resource_group =
name = rg-sap-501-e2
location = eastus2
tags =
owner = for SAP
os_account =
admin_username = locadm
proximity_placement_groups =
ppg-501 =
availability_sets =
avset-cs-501 =
ppg_name = ppg-501
avset-app-501 =
ppg_name = ppg-501
avset-db-501 =
ppg_name = ppg-501
load_balancers =
ilb-sap-501 =
dv2ascs =
ip_address = 192.0.18.20
probe_port = 62000
subnet = app
dv2-ers =
ip_address = 192.0.18.21
probe_port = 62102
subnet = app
ilb-db-501 =
dv2-hana =
ip_address = 192.0.17.12
probe_port = 62503
subnet = db
server_groups =
ascs =
os_type = linux
sku = Standard_E4s_v3
availability_set = avset-cs-501
backup_policy = sap
ppg_name = ppg-501
lb_refs =
dv2-ascs
dv2-ers
os_disk_size = 30
enable_accelerated_networking = True
hosts =
vcs501-01 =
nics =
192.0.18.18
vcs501-02 =
nics =
192.0.18.19
subnet = app
image_details =
resource_id =
marketplace_reference =
publisher = SUSE
offer = sles-sap-15-sp1
sku = gen1
version = latest
disks =
name = usrsap
disk_size = 128
number_of_disks = 1
apps =
type = app_linux
os_type = linux
sku = Standard_E4s_v3
availability_set = avset-app-501
backup_policy = sap
ppg_name = ppg-501
enable_accelerated_networking = True
os_disk_size = 30
hosts =
vas501-01 =
nics =
192.0.18.16
192.0.18.26
vas501-02 =
nics =
192.0.18.17
192.0.18.27
subnet = app
image_details =
resource_id =
marketplace_reference =
publisher = SUSE
offer = sles-15-sp1
sku = gen1
version = latest
disks =
name = usrsap
disk_size = 128
number_of_disks = 1
hana =
os_type = linux
sku = Standard_E32s_v3
availability_set = avset-db-501
backup_policy = sap
ppg_name = ppg-501
os_disk_size = 30
subnet = db
lb_refs =
dv2-hana
hosts =
vhs501-01 =
nics =
192.0.17.10
vhs501-02 =
nics =
192.0.17.11
image_details =
resource_id =
marketplace_reference =
publisher = SUSE
offer = sles-sap-15-sp1
sku = gen1
version = latest
disks =
name = usrsap
disk_size = 128
number_of_disks = 1
name = hanashared
disk_size = 128
number_of_disks = 1
name = hanadata
disk_size = 128
number_of_disks = 3
name = hanalog
disk_size = 128
number_of_disks = 2
name = hanabackup
disk_size = 512
number_of_disks = 1
正在使用 Powershell 读取 JSON 层次结构(子节点数可以是任意数字)文件。 我可以在一个级别上执行此操作,但 N 个循环和嵌套循环需要相同的级别 需要树视图中的结果,如果不可能,则采用表格方式,标题位于根 table
之上下面是我目前开发的脚本:
$Filepath = 'C:\Users\Learner\Test2.JSON'
$JsonContent=gc $Filepath | ConvertFrom-Json
$RootNodeCount=$JsonContent.psobject.Properties.name.Count
$RootNodeName=$JsonContent.psobject.Properties.name
foreach ($Name in $RootNodeName) {Echo $Name--> $JsonContent.$Name}
JSON 文件
{
"foundation": {
"network": {
"resource_group_name": "rg-network-e2",
"name": "nonprodvnet-e2"
},
"diagnostics": {
"resource_group_name": "rg-mgmt-cu",
"storage_account_name": "Sreacnt-e2"
},
"log_analytics": {
"resource_group_name": "rg-mgmt-cu",
"workspace_name": "la-sap-e2"
},
"recovery_vault": {
"resource_group_name": "rg-mgmt-cu",
"name": "rsv-sap-e2"
},
"windows_domain": {
"domain_name": "dmn.local",
"ou_path": "CN=Computers,DC=example,DC=com",
"domain_user": "svc_domainjoin@dmn.local",
"domain_password": "Pwd01"
}
},
"control_flags": {
"enable_boot_diagnostics": true,
"enable_oms": false,
"enable_backup": true,
"windows_domain_join": false
},
"deployment": {
"resource_group": {
"name": "rg-sap-501-e2",
"location": "eastus2"
},
"tags": {
"owner": "for SAP"
},
"os_account": {
"admin_username": "locadm"
},
"proximity_placement_groups": {
"ppg-501": {}
},
"availability_sets": {
"avset-cs-501": {
"ppg_name": "ppg-501"
},
"avset-app-501": {
"ppg_name": "ppg-501"
},
"avset-db-501": {
"ppg_name": "ppg-501"
}
},
"load_balancers": {
"ilb-sap-501": {
"dv2ascs": {
"ip_address": "192.0.18.20",
"probe_port": 62000,
"subnet": "app"
},
"dv2-ers": {
"ip_address": "192.0.18.21",
"probe_port": 62102,
"subnet": "app"
}
},
"ilb-db-501": {
"dv2-hana": {
"ip_address": "192.0.17.12",
"probe_port": 62503,
"subnet": "db"
}
}
},
"server_groups": {
"ascs": {
"os_type": "linux",
"sku": "Standard_E4s_v3",
"availability_set": "avset-cs-501",
"backup_policy": "sap",
"ppg_name": "ppg-501",
"lb_refs": [
"dv2-ascs",
"dv2-ers"
],
"os_disk_size": "30",
"enable_accelerated_networking": true,
"hosts": {
"vcs501-01": {
"nics": [
[
"192.0.18.18"
]
]
},
"vcs501-02": {
"nics": [
[
"192.0.18.19"
]
]
}
},
"subnet": "app",
"image_details": {
"resource_id": null,
"marketplace_reference": {
"publisher" : "SUSE",
"offer" : "sles-sap-15-sp1",
"sku" : "gen1",
"version": "latest"
}
},
"disks": [
{
"name": "usrsap",
"disk_size": "128",
"number_of_disks": 1
}
]
},
"apps": {
"type": "app_linux",
"os_type": "linux",
"sku": "Standard_E4s_v3",
"availability_set": "avset-app-501",
"backup_policy": "sap",
"ppg_name": "ppg-501",
"enable_accelerated_networking": true,
"os_disk_size": "30",
"hosts": {
"vas501-01": {
"nics": [
[
"192.0.18.16",
"192.0.18.26"
]
]
},
"vas501-02": {
"nics": [
[
"192.0.18.17",
"192.0.18.27"
]
]
}
},
"subnet": "app",
"image_details": {
"resource_id": null,
"marketplace_reference": {
"publisher" : "SUSE",
"offer" : "sles-15-sp1",
"sku" : "gen1",
"version": "latest"
}
},
"disks": [
{
"name": "usrsap",
"disk_size": "128",
"number_of_disks": 1
}
]
},
"hana": {
"os_type": "linux",
"sku": "Standard_E32s_v3",
"availability_set": "avset-db-501",
"backup_policy": "sap",
"ppg_name": "ppg-501",
"os_disk_size": "30",
"subnet": "db",
"lb_refs": [
"dv2-hana"
],
"hosts": {
"vhs501-01": {
"nics": [
[
"192.0.17.10"
]
]
},
"vhs501-02": {
"nics": [
[
"192.0.17.11"
]
]
}
},
"image_details": {
"resource_id": null,
"marketplace_reference": {
"publisher" : "SUSE",
"offer" : "sles-sap-15-sp1",
"sku" : "gen1",
"version": "latest"
}
},
"disks": [
{
"name": "usrsap",
"disk_size": "128",
"number_of_disks": 1
},
{
"name": "hanashared",
"disk_size": "128",
"number_of_disks": 1
},
{
"name": "hanadata",
"disk_size": "128",
"number_of_disks": 3
},
{
"name": "hanalog",
"disk_size": "128",
"number_of_disks": 2
},
{
"name": "hanabackup",
"disk_size": "512",
"number_of_disks": 1
}
]
}
}
}
}
您并不是真正在阅读 Json
文件,而是实际上是 PowerShell object 的层次结构,它可能包含很多 (.Net) object 类型,但在这种情况下它受限于原来的 Json 结构,它只包含三种主要类型:
- 数组,包含多个child objects
- PSCustomObjects (unless you use the
ConvertFrom-Json -AsHashTable
参数),包含分配给特定名称的 child object。 - Primitives(包括字符串),它基本上是一个没有 children.[=45 的 object ("leaf") =]
阅读未知深度的层次结构的最佳方法是使用 recursive
函数,即调用自身的函数。为您的具体问题举个例子:
Function Show-Object ($Object, $Depth = 0, $Name) {
$Indent = if ($Depth++) { " " * ($Depth - 2) }
if ($Object -is [Array]) {
If ($Name) { "$Indent$Name =" }
foreach ($Item in $Object) {
Show-Object $Item $Depth
}
}
elseif ($Object -is [PSCustomObject]) {
If ($Name) { "$Indent$Name =" }
foreach ($Name in $Object.PSObject.Properties.Name) {
Show-Object $Object.$Name $Depth $Name
}
}
else {
if ($Name) { "$Indent$Name = $Object" } else { "$Indent$Object" }
}
}
如您所见,结构可能是 child object(在 [Array]
或 [PSCustomObject]
的情况下),Show-Object
函数使用 child object 作为新输入 object 和一些附加参数调用自身,例如跟踪当前 $Depth
.
您可以像这样简单地调用该函数:
Show-Object $JsonContent
或将其导出到如下文件:
Show-Object $JsonContent | Out-File .\text1.txt
对于您的 $JsonContent
它将导致:
foundation =
network =
resource_group_name = rg-network-e2
name = nonprodvnet-e2
diagnostics =
resource_group_name = rg-mgmt-cu
storage_account_name = Sreacnt-e2
log_analytics =
resource_group_name = rg-mgmt-cu
workspace_name = la-sap-e2
recovery_vault =
resource_group_name = rg-mgmt-cu
name = rsv-sap-e2
windows_domain =
domain_name = dmn.local
ou_path = CN=Computers,DC=example,DC=com
domain_user = svc_domainjoin@dmn.local
domain_password = Pwd01
control_flags =
enable_boot_diagnostics = True
enable_oms = False
enable_backup = True
windows_domain_join = False
deployment =
resource_group =
name = rg-sap-501-e2
location = eastus2
tags =
owner = for SAP
os_account =
admin_username = locadm
proximity_placement_groups =
ppg-501 =
availability_sets =
avset-cs-501 =
ppg_name = ppg-501
avset-app-501 =
ppg_name = ppg-501
avset-db-501 =
ppg_name = ppg-501
load_balancers =
ilb-sap-501 =
dv2ascs =
ip_address = 192.0.18.20
probe_port = 62000
subnet = app
dv2-ers =
ip_address = 192.0.18.21
probe_port = 62102
subnet = app
ilb-db-501 =
dv2-hana =
ip_address = 192.0.17.12
probe_port = 62503
subnet = db
server_groups =
ascs =
os_type = linux
sku = Standard_E4s_v3
availability_set = avset-cs-501
backup_policy = sap
ppg_name = ppg-501
lb_refs =
dv2-ascs
dv2-ers
os_disk_size = 30
enable_accelerated_networking = True
hosts =
vcs501-01 =
nics =
192.0.18.18
vcs501-02 =
nics =
192.0.18.19
subnet = app
image_details =
resource_id =
marketplace_reference =
publisher = SUSE
offer = sles-sap-15-sp1
sku = gen1
version = latest
disks =
name = usrsap
disk_size = 128
number_of_disks = 1
apps =
type = app_linux
os_type = linux
sku = Standard_E4s_v3
availability_set = avset-app-501
backup_policy = sap
ppg_name = ppg-501
enable_accelerated_networking = True
os_disk_size = 30
hosts =
vas501-01 =
nics =
192.0.18.16
192.0.18.26
vas501-02 =
nics =
192.0.18.17
192.0.18.27
subnet = app
image_details =
resource_id =
marketplace_reference =
publisher = SUSE
offer = sles-15-sp1
sku = gen1
version = latest
disks =
name = usrsap
disk_size = 128
number_of_disks = 1
hana =
os_type = linux
sku = Standard_E32s_v3
availability_set = avset-db-501
backup_policy = sap
ppg_name = ppg-501
os_disk_size = 30
subnet = db
lb_refs =
dv2-hana
hosts =
vhs501-01 =
nics =
192.0.17.10
vhs501-02 =
nics =
192.0.17.11
image_details =
resource_id =
marketplace_reference =
publisher = SUSE
offer = sles-sap-15-sp1
sku = gen1
version = latest
disks =
name = usrsap
disk_size = 128
number_of_disks = 1
name = hanashared
disk_size = 128
number_of_disks = 1
name = hanadata
disk_size = 128
number_of_disks = 3
name = hanalog
disk_size = 128
number_of_disks = 2
name = hanabackup
disk_size = 512
number_of_disks = 1