问题描述
powershell 新手.. 我有 2 个 Json ,第一个是从文件中获取的,第二个是我在执行查询后转换的。如果 name 部分中的值在两个 json 中相同,我想更新第二个文件的 tag 部分中的值:
$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
}
]
$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
}