【发布时间】:2021-04-18 14:50:50
【问题描述】:
我是 PS 的新手....试图在给定的订阅中获取 NSG(一旦这对所有订阅都有效)以显示以下属性(NSG 名称、位置、资源组、子网、NIC) .
我正在使用来自Getting list of NSG and corresponding 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/子网的空值,因为某些 NSG 将分配给子网,而其他 NSG 将分配给 NIC 最后一个 NSG 可以分配给多个子网/NIC,那么我如何获得 $azNsg.Subnets。 Id.Split('/')[-1] 部分适用于 Subnets.Id 或 NetworkInterfaces.Id 中的多个条目,而不仅仅是最后一个?
谢谢
【问题讨论】:
-
您不需要在
foreach循环内第二次调用Get-AzNetworkSecurityGroup。只需使用$azNsg | Select-Object ....。 -
非常感谢@AdminOfThings .. 这似乎已经解决了那部分.. 你能帮我解决查询的第二部分,我想查看与每个 NSG 关联的子网和/或 NIC 吗?它应该列出所有子网/网卡,而不仅仅是最后一个
-
Index
[-1]获取数组的最后一个元素。如果您不只想要最后一个元素,那么您应该删除该索引。由于您使用if语句来设置$NsgSubnets,因此当没有子网时它不会被重置。您的foreach的第一行需要类似于$NsgSubnets = $null。 -
看了链接的帖子后,我想我明白了更多的问题。子网 ID 是一个路径,您只需要该路径的叶子(仅名称)。你可以试试
$NsgSubnets = $azNsg.Subnets.foreach({$_.Id.Split('/')[-1]})
标签: powershell azure-nsg