首页 > 解决方案 > 注意 PSObject 中的属性未在 Foreach 循环中填充 | NSG 详细信息导出到 CSV

问题描述

我正在创建一个 Azure PS 脚本,它将获取所有 NSG,然后查找它是否附加到子网或 NIC

当我运行以下命令时,它会给出没有“附加到子网”列的输出。但是,当我使用 -ResourceGroupName 属性运行相同的 cmdlet 时,它会给出所需的“附加到子网”和“附加到 Nic”NoteProperty 的输出。

我无法调试为什么它没有添加“附加到子网”列Get-AzureRmNetworkSecurityGroup

$NSGdetails = @()

Get-AzureRmNetworkSecurityGroup | ForEach-Object {

    $D2 = New-Object PSObject

    Write-Host $_.Name 

    $subnet = $_.Subnets.Id
    $nic = $_.NetworkInterfaces.id

    $D2 | Add-Member -MemberType NoteProperty -Name "NSG Name" -Value $_.Name -Force

    if ($subnet -ne $null) { 
        $subnetdetail = $subnet.Split('/')[-1]
        $D2 | Add-Member -MemberType NoteProperty -Name "Attached To Subnet" -Value $subnetdetail -Force
    }

    if ($nic -ne $null) {
        $nicdetail = $nic.Split('/')[-1]
        $D2 | Add-Member -MemberType NoteProperty -Name "Attached To NIC" -Value $nicdetail -Force
    }

    $NSGdetails += $D2
}

$NSGdetails | Export-Csv -Path "C:\temp\allnicdetails.csv"  -NoTypeInformation -Force 

下面是输出Get-AzureRmNetworkSecurityGroup -ResourceGroupName RAH-AQ

PS C:\Users\021176\Desktop> $NSGdetails

NSG Name    Attached To Subnet Attached To NIC
--------    ------------------ ---------------
linuxvm-nsg default            linuxvm15      
redhat-nsg                     redhat396      

输出Get-AzureRmNetworkSecurityGroup如下所述

PS C:\Users\021176\Desktop> $NSGdetails

NSG Name       Attached To NIC
--------       ---------------
demolinux-nsg  demolinux76    
devnsg         devnic         
mastesta1-nsg  mastesta1275   
TutorialVM1    TutorialVM1    
filenetapp-nsg filenetapp828  
testvm1NSG                    
nehatest-nsg   nehatest995    
RHEL-nsg       rhel858        
linuxvm-nsg    linuxvm15      
linuxvm-nsg    linuxvm15      
redhat-nsg     redhat396      
SQLBackup-nsg  sqlbackup454   
opnvpntest-nsg opnvpntest764  

标签: azurepowershellazure-powershell

解决方案


Attached To Subnet属性不会在 CSV 中结束,因为只有一些对象具有该属性,并Export-Csv根据第一个输入对象决定要解析和写入的属性。更改您的代码以始终添加该属性,无论它是否有值:

if ($subnet -ne $null) { 
    $subnetdetail = $subnet.Split('/')[-1]
} else {
    $subnetdetail = $null
}
$D2 | Add-Member -MemberType NoteProperty -Name "Attached To Subnet" -Value $subnetdetail -Force

if ($nic -ne $null) {
    $nicdetail = $nic.Split('/')[-1]
} else {
    $nicdetail = $null
}
$D2 | Add-Member -MemberType NoteProperty -Name "Attached To NIC" -Value $nicdetail -Force

推荐阅读