0

我是 PS 的新手......试图在给定的订阅中获取 NSG(一旦这对所有订阅都有效)以显示以下属性(NSG 名称、位置、资源组、子网、NIC)。

我正在使用获取 NSG 列表和相应的子网或 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 中的多个条目,而不仅仅是最后一个?

谢谢

4

1 回答 1

0

您可以执行以下操作:

$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是非空对象数组的情况。使用该foreach()方法,您可以针对该数组的每个元素处理代码。当 PowerShell 完全枚举数组输出时(就像在没有 的情况下所做的那样foreach()),您的多个子网数组将成为最终输出上的一个大数组。然后[-1]只返回最后一个Id值。
  • $NsgSubnetsif没有语句的情况下设置else语句会导致稍后在代码执行中出现错误数据。如果网络有子网,$NsgSubnets将正确设置并返回。但是,如果下一个网络没有子网,则不会更新 的值$NsgSubnetsSelect-Object因此,它会在你的命令中输出之前网络的子网信息。
  • 您并不总是需要反引号来继续。|并且,分隔元素自动支持继续。请参阅自然线延续
于 2021-01-13T15:46:18.313 回答