azure - 强制 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"
}
}
解决方案
根据错误:方法调用失败,因为[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"
}
}
}
推荐阅读
- image - 如何改进此图像的 tesseract-OCR
- php - 使用 Symfony 4 重复插入
- amazon-dynamodb - 从 DynamoDB 迁移到 Spanner/BigTable
- haskell - 计算字符列表中的数字
- laravel - Laravel 慢插入
- angular - 如何在 Angular 4 post API 调用中删除授权承载
- c++ - 使用 avformat_open_input 打开原始音频
- objective-c - 是否可以将 NSString 转换为 NSData?
- javascript - 功能组件状态持久性
- firebase - 如何解决 orderByChild 的 Firebase 未指定索引错误?