为所有订阅获取与给定NSG关联的子网和NIC



我是PS的新手。…正在尝试在给定订阅中获取NSG(一旦对所有订阅都能做到这一点(,以显示以下属性(NSG名称、位置、资源组、子网、NIC(。

我使用的是Getting list of NSG and correspondent Subnet or NIC中的以下脚本,但它为每个NSG列出的相同信息多次等于订阅中的NSG数量,因此脚本中一定有问题

$azNsgs = Get-AzNetworkSecurityGroup

foreach ( $azNsg in $azNsgs ) {
if ($azNsg.Subnets.Id -ne $null) {
$NsgSubnets = $azNsg.Subnets.Id.Split('/')[-1]
}
Get-AzNetworkSecurityGroup | `
Select-Object `
@{name = 'NSG Name'; expression = {$azNsg.Name} },  `
@{name = 'Location'; expression = {$azNsg.Location} }, `
@{name = 'Resource Group Name'; expression = {$azNsg.ResourceGroupName} },  `
@{name = 'Subnets'; expression = $NsgSubnets } 

}

还希望脚本忽略NIC/Subnet的空值,因为一些NSG将被分配给子网,而另一些则被分配给NIC。最后,一个NSG可以被分配给多个子网/NIC,那么我如何获得$azNsg.Subnets.Id.Split('/'([-1]部分,该部分用于子网.Id或NetworkInterfaces.Id中的多个条目,而不仅仅是最后一个?

感谢

您可以执行以下操作:

$azNsgs = Get-AzNetworkSecurityGroup

foreach ( $azNsg in $azNsgs ) {
$NsgSubnets = $null
if (!$azNsg.Subnets.Id) {
$NsgSubnets = $azNsg.Subnets.foreach({$_.Id.Split('/')[-1]})
}
$azNsg |
Select-Object @{name = 'NSG Name'; expression = {$_.Name}},
@{name = 'Location'; expression = {$_.Location}},
@{name = 'Resource Group Name'; expression = {$_.ResourceGroupName}},  
@{name = 'Subnets'; expression = {$NsgSubnets -join ','}}

}

总体改进包括:

  • 您只需要运行Get-AzNetworkSecurityGroup一次,因为您将其输出存储到一个变量中。您可以简单地从变量中检索其内容。这使得代码执行得更快
  • 由于对象可能有多个子网,因此当$azNsg.Subnets是非null对象的数组时,需要处理这种情况。使用foreach()方法,可以针对该数组的每个元素处理代码。当PowerShell完全枚举阵列输出时(就像在没有foreach()的情况下所做的那样(,您的多个子网阵列在最终输出中变成一个大阵列。则[-1]仅返回最后一个Id
  • 在没有else语句的if语句中设置$NsgSubnets会导致代码执行后期出现错误数据。如果网络有子网,则会正确设置并返回$NsgSubnets。但是,如果下一个网络没有子网,则不会更新$NsgSubnets的值。因此,它将在Select-Object命令中输出以前网络的子网信息
  • 您并不总是需要回溯才能继续。CCD_ 13和CCD_。请参见自然线延续

最新更新