我是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_。请参见自然线延续