如何将数组值传递给Get命令?PowerShell IP查询代码优化
如何用数组筛选符合子网规则的IP地址?
问题描述
原始实现通过多个变量存储子网规则,用-or拼接筛选条件:
$OldSub1 = "192.168.1.*" $OldSub2 = "192.168.2.*" $OldSub3 = "192.168.3.*" $OldSub4 = "192.168.4.*" $OldIp = Get-NetIpAddress | where { ($_.IPAddress -like $OldSub1) -or ($_.IPAddress -like $OldSub2) -or ($_.IPAddress -like $OldSub3) -or ($_.IPAddress -like $OldSub4) } if ($OldIp.IPAddress -eq $null) {write "Null"} $OldIp
尝试改用数组实现,但代码执行后$OldIp未正确获取值:
$OldSubNets = @( "192.168.1.*", "192.168.2.*" ) foreach ($i in $OldSubNets){ if (-not($i -eq $null)){ $OldIp = Get-NetIpAddress | where { $_.IPAddress -like $i } } } $OldIp
问题原因
你写的循环代码存在两个核心问题:
- 每次循环都会覆盖
$OldIp变量,最终只保留最后一个子网规则的筛选结果;如果最后一个子网没有匹配的IP,$OldIp就为空。 - 多次调用
Get-NetIpAddress,效率较低。
正确实现方法
方法一:利用PowerShell -like的数组匹配特性(推荐)
PowerShell的-like运算符支持右侧传入数组,只要IP地址匹配数组中任意一个通配符规则,就会被筛选出来,且只需调用一次Get-NetIpAddress:
$OldSubNets = @( "192.168.1.*", "192.168.2.*", "192.168.3.*", "192.168.4.*" ) # 一次筛选所有符合任意子网规则的IP $OldIp = Get-NetIpAddress | Where-Object { $_.IPAddress -like $OldSubNets } # 判断结果是否为空 if (-not $OldIp) { Write-Host "Null" } $OldIp
方法二:循环收集结果(适合复杂场景)
如果需要在循环中做额外处理,可以初始化空数组,每次将筛选结果追加进去,最后可选去重:
$OldSubNets = @( "192.168.1.*", "192.168.2.*" ) # 初始化空数组存储结果 $OldIp = @() foreach ($subnet in $OldSubNets) { # 将当前子网的匹配结果追加到数组 $OldIp += Get-NetIpAddress | Where-Object { $_.IPAddress -like $subnet } } # 去重(避免同一个IP匹配多个规则时重复出现) $OldIp = $OldIp | Select-Object -Unique if (-not $OldIp) { Write-Host "Null" } $OldIp
内容的提问来源于stack exchange,提问作者alphadmin
相关产品推荐
相关产品推荐

