You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数组值传递给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

问题原因

你写的循环代码存在两个核心问题:

  1. 每次循环都会覆盖$OldIp变量,最终只保留最后一个子网规则的筛选结果;如果最后一个子网没有匹配的IP,$OldIp就为空。
  2. 多次调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:05:34