powershell 如何将值数组传递给Get命令

h5qlskok  于 2023-10-18  发布在  Shell
关注(0)|答案(1)|浏览(114)

我的一部分代码

$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
mgdq6dx1

mgdq6dx11#

  • 将数组迭代循环移动到Where-Objectwhere)块中。
  • 一旦找到匹配,停止迭代并返回$true
# Note: A typo was corrected "Subents" -> "Subnets"
$OldSubnets = @(
"192.168.1.*",
"192.168.2.*"
)

$OldIp = 
  Get-NetIpAddress | Where-Object { 
    foreach ($i in $OldSubnets) {
      if ($_.IPAddress -like $i) { return $true }
    }
  }

如果您使用-match而不是-like,则可以简化解决方案:这允许使用regex,它允许您使用交替(|)一次测试多个模式:

# Note: Do NOT use the "*" at the end.
$OldSubnetPrefixes = @(
  "192.168.1.",
  "192.168.2."
)

# Construct a regex from the prefixes.
$oldSubnetsRegex = 
  '^(?:{0})' -f ($OldSubnetPrefixes.ForEach({ [regex]::Escape($_) }) -join '|')

$OldIp = 
  Get-NetIpAddress | Where-Object IPAddress -match $oldSubnetsRegex

$oldSubnetsRegex接收字符串'^(?:192\.168\.1\.|192\.168\.2\.)',显然也可以直接构造这样的正则表达式;有关正则表达式的解释和使用它的选项,请参见this regex101.com page
还要注意在Where-Object调用中使用了simplified syntax

相关问题