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]}
我正在尝试浏览服务器列表,以便通过 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]}