powershell 加载 json 迭代并使用键和值

问题描述

powershell 新手.. 我有 2 个 Json ,第一个是从文件获取的,第二个是我在执行查询后转换的。如果 name 部分中的值在两个 json 中相同,我想更新第二个文件的 tag 部分中的值:

json 文件 1 使用以下内容创建和读取/加载:

$service = Get-AzResource -ResourceGroupName $sourcergname  | select-object Name,ResourceGroupName,ResourceType,Location,ResourceId,Tags
ConvertTo-Json $service | Out-File "$subscriptionid\resourceGroups\$sourcergname\Source_RG_Service_level_tags.json"
$RG_services_level_tags_json = Get-Content "$subscriptionid\resourceGroups\$sourcergname\Source_RG_Service_level_tags.json" | Out-String | ConvertFrom-Json

然后它给出:

[
        {
            "Name":  "vnet-prd-secretenv","ResourceGroupName":  "rg-prd-secretrg","ResourceType":  "Microsoft.Network/virtualNetworks","Location":  "westeurope","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Network/virtualNetworks/vnet-prd-secretenv","Tags":  {

                    }
        },{
            "Name":  "host-1-prd-secretenv_Datadisk_0","ResourceType":  "Microsoft.Compute/disks","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Compute/disks/host-1-prd-secretenv_Datadisk_0","Tags":  null
        },{
            "Name":  "host-1-prd-secretenv_Datadisk_2","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Compute/disks/host-1-prd-secretenv_Datadisk_2",{
            "Name":  "host-1-prd-secretenv-nsg","ResourceType":  "Microsoft.Network/networkSecurityGroups","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Network/networkSecurityGroups/host-1-prd-secretenv-nsg",{
            "Name":  "host-1-prd-secretenv_Datadisk_3","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Compute/disks/host-1-prd-secretenv_Datadisk_3",{
            "Name":  "host-1-prd-secretenv-puip","ResourceType":  "Microsoft.Network/publicIPAddresses","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Network/publicIPAddresses/host-1-prd-secretenv-puip",{
            "Name":  "rgprdsecretrgdiag","ResourceType":  "Microsoft.Storage/storageAccounts","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Storage/storageAccounts/rgprdsecretrgdiag",{
            "Name":  "host-1-prd-secretenv_Datadisk_1","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Compute/disks/host-1-prd-secretenv_Datadisk_1",{
            "Name":  "host-1-prd-meetechssf622","ResourceType":  "Microsoft.Network/networkInterfaces","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Network/networkInterfaces/host-1-prd-meetechssf622",{
            "Name":  "host-1-prd-secretenv","ResourceType":  "Microsoft.Compute/virtualMachines","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Compute/virtualMachines/host-1-prd-secretenv","Tags":  {
                        "services_tag_1":  "dummy_services_tag_1","services_tag_2":  "dummy_services_tag_2"
                    }
        },{
            "Name":  "host-1-prd-secretenv_Osdisk_1_02133b0f90d645a7a309f68fbceaa743","ResourceGroupName":  "RG-PRD-secretrg","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/RG-PRD-secretrg/providers/Microsoft.Compute/disks/host-1-prd-secretenv_Osdisk_1_02133b0f90d645a7a309f68fbceaa743",{
            "Name":  "host-1-prd-secretenv/Microsoft.Insights.VMDiagnosticsSettings","ResourceType":  "Microsoft.Compute/virtualMachines/extensions","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Compute/virtualMachines/host-1-prd-secretenv/extensions/Microsoft.Insights.VMDiagnosticsSettings",{
            "Name":  "secretenv.com","ResourceType":  "Microsoft.Network/dnszones","Location":  "global","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Network/dnszones/secretenv.com","ResourceType":  "Microsoft.DomainRegistration/domains","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.DomainRegistration/domains/secretenv.com",{
            "Name":  "secretenv","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Storage/storageAccounts/secretenv",{
            "Name":  "host-1-prd-secretenv/MicrosoftMonitoringAgent","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/RG-PRD-secretrg/providers/Microsoft.Compute/virtualMachines/host-1-prd-secretenv/extensions/MicrosoftMonitoringAgent",{
            "Name":  "testmigrationmourad","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Storage/storageAccounts/testmigrationmourad",{
            "Name":  "stop-start-meetechsfrwrd","ResourceType":  "Microsoft.Automation/automationAccounts","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd","Tags":  {
                        "StartStopVMVersion":  "1.0.0.0"
                    }
        },{
            "Name":  "stop-start-meetechsfrwrd/AzureAutomationTutorialPython2","ResourceType":  "Microsoft.Automation/automationAccounts/runbooks","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/AzureAutomationTutorialPython2",{
            "Name":  "stop-start-meetechsfrwrd/AzureAutomationTutorial","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/AzureAutomationTutorial",{
            "Name":  "stop-start-meetechsfrwrd/AzureAutomationTutorialScript","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/AzureAutomationTutorialScript",{
            "Name":  "secretenv-laws","ResourceType":  "Microsoft.OperationalInsights/workspaces","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.OperationalInsights/workspaces/secretenv-laws",{
            "Name":  "AutoStop_VM_Child","ResourceType":  "Microsoft.Insights/scheduledqueryrules","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Insights/scheduledqueryrules/AutoStop_VM_Child","Tags":  {
                        "hidden-link:/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.OperationalInsights/workspaces/secretenv-laws":  "Resource"
                    }
        },{
            "Name":  "SequencedStartStop_Parent","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Insights/scheduledqueryrules/SequencedStartStop_Parent",{
            "Name":  "StartStop_VM_Notification","ResourceType":  "Microsoft.Insights/actiongroups","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Insights/actiongroups/StartStop_VM_Notification",{
            "Name":  "ScheduledStartStop_Parent","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Insights/scheduledqueryrules/ScheduledStartStop_Parent",{
            "Name":  "stop-start-meetechsfrwrd/AutoStop_VM_Child_ARM","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/AutoStop_VM_Child_ARM","Tags":  {
                        "version":  "1.0.0.0"
                    }
        },{
            "Name":  "stop-start-meetechsfrwrd/ScheduledStartStop_Base_Classic","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/ScheduledStartStop_Base_Classic","Tags":  {
                        "version":  "2.0.0.0"
                    }
        },{
            "Name":  "stop-start-meetechsfrwrd/ScheduledStartStop_Child_Classic","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/ScheduledStartStop_Child_Classic",{
            "Name":  "stop-start-meetechsfrwrd/AutoStop_Createalert_Child","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/AutoStop_Createalert_Child",{
            "Name":  "stop-start-meetechsfrwrd/AutoStop_disable","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/AutoStop_disable",{
            "Name":  "stop-start-meetechsfrwrd/ScheduledStartStop_Parent","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/ScheduledStartStop_Parent",{
            "Name":  "stop-start-meetechsfrwrd/AutoStop_VM_Child","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/AutoStop_VM_Child",{
            "Name":  "stop-start-meetechsfrwrd/SequencedStartStop_Parent","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/SequencedStartStop_Parent",{
            "Name":  "stop-start-meetechsfrwrd/AutoStop_Createalert_Parent","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/AutoStop_Createalert_Parent",{
            "Name":  "stop-start-meetechsfrwrd/ScheduledStartStop_Child","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Automation/automationAccounts/stop-start-meetechsfrwrd/runbooks/ScheduledStartStop_Child",{
            "Name":  "Start-Stop-VM[secretenv-laws]","ResourceType":  "Microsoft.OperationsManagement/solutions","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.OperationsManagement/solutions/Start-Stop-VM[secretenv-laws]",{
            "Name":  "ntwvpn-1-prd-secretenv-ip","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Network/publicIPAddresses/ntwvpn-1-prd-secretenv-ip",{
            "Name":  "ntwvpn-1-prd-meetechs254","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Network/networkInterfaces/ntwvpn-1-prd-meetechs254",{
            "Name":  "ntwvpn-1-prd-secretenv","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rg-prd-secretrg/providers/Microsoft.Compute/virtualMachines/ntwvpn-1-prd-secretenv",{
            "Name":  "ntwvpn-1-prd-secretenv_Osdisk_1_0f679e0fb7ac4be0be87275e50c83020","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/RG-PRD-secretrg/providers/Microsoft.Compute/disks/ntwvpn-1-prd-secretenv_Osdisk_1_0f679e0fb7ac4be0be87275e50c83020",{
            "Name":  "ntwvpn-1-prd-secretenv/MMAExtension","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/RG-PRD-secretrg/providers/Microsoft.Compute/virtualMachines/ntwvpn-1-prd-secretenv/extensions/MMAExtension","Tags":  null
        }
    ]

获取第二个json并使用以下内容读取:

 $service_level_tags_target = Get-AzResource -ResourceGroupName $targetrgname  | select-object Name,Tags
 ConvertTo-Json $service_level_tags_target 

然后,它给出:

    [
        {
            "Name":  "mover_vnet","ResourceGroupName":  "rgmover_test-uaenorth","Location":  "uaenorth","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rgmover_test-uaenorth/providers/Microsoft.Network/virtualNetworks/mover_vnet",{
            "Name":  "vmtobemoved-ip","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rgmover_test-uaenorth/providers/Microsoft.Network/publicIPAddresses/vmtobemoved-ip",{
            "Name":  "vmtobemoved-nsg","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rgmover_test-uaenorth/providers/Microsoft.Network/networkSecurityGroups/vmtobemoved-nsg",{
            "Name":  "vmtobemoved746","ResourceId":  "/subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rgmover_test-uaenorth/providers/Microsoft.Network/networkInterfaces/vmtobemoved746","Tags":  null
        }
    ]

解决方法

那么,对于第一个问题,如何找到第二个 JSON 中 Name 值在第一个 JSON 的 Name 值中的项目:

  • 首先,您可以将第一个转换为对象(就像您已经在做的那样):
$RG_services_level_tags_json = Get-Content "$subscriptionid\resourceGroups\$sourcergname\Source_RG_Service_level_tags.json" -Raw |
ConvertFrom-Json

$service_level_tags_target = Get-AzResource -ResourceGroupName $targetrgname |
Select-Object Name,ResourceGroupName,ResourceType,Location,ResourceId,Tags
  • 现在有很多方法可以做到这一点,您可以通过以下方式找到 $service_level_tags_target 上的项目。 注意:我更新了第二个 JSON 的名称,所以至少我们得到了 2 个匹配
# Example 1 using -in Operator
$result = $service_level_tags_target.Where({$_.Name -in $RG_services_level_tags_json.Name})

# Example 2 using -contains Operator
$result = $service_level_tags_target.Where({$RG_services_level_tags_json.Name -contains $_.Name})

我建议您阅读 Comparison Operators 以了解哪一种最适合您的需要。例如,如果您想部分匹配,您也可以使用 -match

这将返回 2 个匹配项:

Name              : stop-start-meetechsfrwrd/AutoStop_VM_Child
ResourceGroupName : rgmover_test-uaenorth
ResourceType      : Microsoft.Network/virtualNetworks
Location          : uaenorth
ResourceId        : /subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rgmover_test-uaenorth/providers/Microsoft.Network/virtualNetworks/mover_vnet
Tags              : 

Name              : host-1-prd-secretenv_DataDisk_1
ResourceGroupName : rgmover_test-uaenorth
ResourceType      : Microsoft.Network/networkSecurityGroups
Location          : uaenorth
ResourceId        : /subscriptions/XXXXX-XXXXX-XXXXX/resourceGroups/rgmover_test-uaenorth/providers/Microsoft.Network/networkSecurityGroups/vmtobemoved-nsg
Tags              : 

对于第二个问题,如何更新标签,您需要定义每个匹配的新标签。

foreach($resGroup in $result)
{
    $tagsaddon = # This needs to be defined here!
    Update-AzTag -ResourceId $resGroup.ResourceId -Tag $tagsaddon -Operation Merge
}