Powershell:按 IP 地址的第二个八位字节过滤服务器列表

Powershell: Filtering server list by the 2nd octet of the IP address

我正在尝试浏览服务器列表,以便通过 WMI 进一步查询。不幸的是,如果脚本命中无法通过 WMI 连接的服务器,则需要很长时间才能超时。

这些通常是我们DMZ中的服务器,并在IP地址的第二个八位字节中分配了一个特定地址,例如.92。因此,我希望在查询的第一步中过滤掉这些服务器,以便在任何进一步的 WMI 查询中可以忽略它。

我找到了很多关于如何做到这一点的例子,同样,我不能使用 WMI 方法,因为这会破坏对象(例如:Get-WmiObject Win32_NetworkAdapterConfiguration)。

在下面的示例中,服务器 "SERVER" 的 IP 为 192.9.4.1,我想过滤掉第二个八位字节中包含“.9”的所有服务器。所以我使用一个简单的 Test-Connection cmdlet,旨在拆分结果。在我拆分之前,Test-Connection 的结果是:

$IP4Address = Test-Connection _Computer SERVER -Count 1 | Select IPV4Address

@{IPV4Address=192.9.4.1}

这意味着我需要从头数 19 个字符才能得到我的“9”。 IPV4地址

  $Octet = $IP4Address -split ("") 
  If ($Octet[19] -eq '9') 
    {write-host "In DMZ"} 
  Else
    {write-host "Not in DMZ"}

在你问之前,我试过-split ("."),但这似乎没有任何效果。

那为什么会出来@{IPV4Address=192.9.4.1}这样的结果呢?有更好的解决方案吗?

-split operator 采用 正则表达式模式 ,而不是字符文字。

在正则表达式中,. 是一个通配符,意思是 "any one character",结果是一组空字符串(输入字符串中每个字符之间的位置)。

要匹配文字点,请使用 \

将其转义
PS C:\> '10.0.122.12' -split '\.'
10
0
122
12

要仅获取 IPV4Address 属性 的值,您必须对其进行扩展:

$IP4Address = Test-Connection -Computer SERVER -Count 1 |
    Select-Object -ExpandProperty IPV4Address

然后可以使用.Split()方法:

if($IPV4Address.Split(".")[1] -eq "9") {
  "In DMZ"
} else {
  "Not in DMZ"
}

PS :我通常使用 -Count 2 而不是 -Count 1

不需要拆分 IP 地址,只需使用-match:

if ($IP4Address -match '^\d+\.9\.') 
{
    write-host "In DMZ"
} 
else
{
    write-host "Not in DMZ"
}

正则表达式:

^\d+\.9\.'


您收到输出 @{IPV4Address=192.9.4.1} 因为您正在选择 object。如果只想获取字符串,使用-ExpandProperty参数:

$IP4Address = Test-Connection _Computer SERVER -Count 1 | Select -ExpandProperty IPV4Address

只是想向您展示另一种不基于拆分的方法,并指出您在使用 "ipaddress" 对象时遇到的问题。您在变量中看到的是一个带有 ipaddress 属性 的对象,应该是您要查找的字符串。您需要扩展 属性 或从您的对象 $IP4Address.Ipaddress 调用 属性。前者是单一属性的更简单的解决方案。

您可以将结果转换为类型加速器 [ipaddress]。这是您可以调用的方法和 return 您要过滤的八位字节。

$IP4Address = Test-Connection -Computer SERVER -Count 1 | Select -ExpandProperty IPV4Address
([ipaddress]$IP4Address).GetAddressBytes()[1]

您需要谨慎使用此方法,因为您还应该进行一些检查以确保 $IP4Address 不为空。

if($IP4Address){([ipaddress]$IP4Address).GetAddressBytes()[1]}