首页 > 解决方案 > 强制 Powershell 将重复值添加到主报告表中

问题描述

我有一个创建公共 IP 报告的脚本。我在一台连接了两个 NIC 的虚拟机上遇到问题。我的脚本以某种方式设计,VM 名称是唯一键,所有其他数据都在此键上关联并分配给主表。有没有办法解决这个问题?这是我的脚本:

#Data collection
$PIP = Get-AzPublicIpAddress

$pipOutput = $PIP | ForEach-Object {
[PSCustomObject]@{
"IP Name" = $_.Name
"IP Address" = $_.IpAddress
"Resource Group Name" = $_.ResourceGroupName
"Location" = $_.Location
"VM Name" = ""
"Network Interface" = ""
"Application" = $_.Tag.Application
"Environment" = $_.Tag.Environment
"Role" = $_.Tag.Role
"Decommission" = $_.Tag.Decommission
"Funding" = $_.Tag.Funding
"Provisioning State" = $_.ProvisioningState
"Allocation Method" = $_.PublicIpAllocationMethod
"Version" = $_.PublicIpAddressVersion
"Idle Timeout In Minutes" = $_.IdleTimeoutInMinutes
}
}

$VMs = Get-AzVm -status
$all = @{}
$end = @{}

foreach ($vm in $VMs) {
    $VMNetworkInterfaceSplitToArray = $vm.NetworkProfile.NetworkInterfaces.id.Split('/')
    $VMNetworkInterfaceObject = Get-AzNetworkInterface -ResourceGroupName $vm.ResourceGroupName -Name $VMNetworkInterfaceSplitToArray[$VMNetworkInterfaceSplitToArray.Count - 1]
    try {
        $VMPublicIpSplitToArray = ($VMNetworkInterfaceObject.IpConfigurations.publicipaddress.Id).Split('/')
        $vm_Public_IP = (Get-AzPublicIpAddress -ResourceGroupName $vm.ResourceGroupName -Name $VMPublicIpSplitToArray[$VMPublicIpSplitToArray.Count - 1]).IpAddress 
    }
    catch {
        $vm_Public_IP = "n/a"
    }

    if($vm_Public_IP -ne "n/a")
    {
    $all.Add($vm_Public_IP,$vm.name)
    $end.Add($vm_Public_IP,$VMNetworkInterfaceObject.name)
    }

    }

foreach ($ipadd in $pipOutput)
{
    if($all.ContainsKey($ipadd."IP Address"))
    {
        $ipadd."VM Name"=$all[$ipadd."IP Address"]
    }
    else
    {
        $ipadd."VM Name"="n/a"
    }
}

foreach ($ipadd in $pipOutput)
{
    if($end.ContainsKey($ipadd."IP Address"))
    {
        $ipadd."Network Interface"=$end[$ipadd."IP Address"]
    }
    else
    {
        $ipadd."Network Interface"="n/a"
    }
}

标签: azurepowershellazure-virtual-machine

解决方案


根据错误:方法调用失败,因为[System.Management.Automation.PSObject]不包含名为'op_Addition'的方法,我建议你创建一个数组来保存你所有的PSCustomObject。例如

Connect-AzAccount

$PIP = Get-AzPublicIpAddress

$pipOutput = $PIP | ForEach-Object {
[PSCustomObject]@{
"IP Name" = $_.Name
"IP Address" = $_.IpAddress
"Resource Group Name" = $_.ResourceGroupName
"Location" = $_.Location
"VM Name" = ""
"Network Interface" = ""
"Application" = $_.Tag.Application
"Environment" = $_.Tag.Environment
"Role" = $_.Tag.Role
"Decommission" = $_.Tag.Decommission
"Funding" = $_.Tag.Funding
"Provisioning State" = $_.ProvisioningState
"Allocation Method" = $_.PublicIpAllocationMethod
"Version" = $_.PublicIpAddressVersion
"Idle Timeout In Minutes" = $_.IdleTimeoutInMinutes
}
}

$vms =Get-AzVM 
$all =@()
Foreach($vm in $vms){
    
    $VMNetworkInterfaceToArray = $vm.NetworkProfile.NetworkInterfaces.id
     foreach($r in $VMNetworkInterfaceToArray ){
 
        $resource = Get-AzResource -ResourceId $r
        $VMNetworkInterfaceObject=Get-AzNetworkInterface -Name $resource.Name -ResourceGroupName $resource.ResourceGroupName
        try{
        $VMPublicIp=Get-AzResource -ResourceId $VMNetworkInterfaceObject.IpConfigurations.publicipaddress.Id
         $vm_Public_IP = (Get-AzPublicIpAddress -ResourceGroupName $VMPublicIp.ResourceGroupName -Name $VMPublicIp.Name).IpAddress 
         }catch {
            $vm_Public_IP = "n/a"
         }

         if($vm_Public_IP -ne "n/a")
        {
             #create custom object to save the details your need
             $obj= [PSCustomObject]@{"VmName"=$vm.Name
                         "VMPublicIP"=$vm_Public_IP
                         "VMNetworkInterface"=$VMNetworkInterfaceObject.Name
                       }
             # save the object into array
             $all +=$obj

        }
     }
}
Foreach($ipadd in $pipOutput){

   foreach($a in $all){
    
     if($a.VMPublicIP=$ipadd.'IP Address'){
       $ipadd.'VM Name' =$a.VmName
       $ipadd.'Network Interface'=$a.VMNetworkInterface
       
     }else{
     
       $ipadd.'VM Name' ="n/a"
       $ipadd.'Network Interface'="n/a"
     
     }
   
   
   }

}
 

更新

请更改脚本如下

Foreach($ipadd in $pipOutput){

   foreach($a in $all){

     if($ipadd.'IP Address'.Equals($a.VMPublicIP)){
     
     $ipadd.'VM Name' =$a.VmName
       $ipadd.'Network Interface'=$a.VMNetworkInterface

     }else{

       $ipadd.'VM Name' ="n/a"
       $ipadd.'Network Interface'="n/a"

     }

   }

}

推荐阅读