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

问题描述 投票:0回答:5

我正在尝试通过

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}
呢?有更好的解决办法吗?

powershell split ip-address
5个回答
3
投票

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

在正则表达式中,

.
是一个通配符,意思是“任何一个字符”,导致空字符串的集合(输入字符串中每个字符之间的位置)。

要匹配文字点,请使用

\

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

3
投票

不需要分割IP地址,只需使用

-match
:

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

正则表达式:

^\d+\.9\.'

Regular expression visualization


您会收到输出

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

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

2
投票

只是想向您展示另一种不基于拆分的方法,并指出您所拥有的“ipaddress”对象所遇到的问题。您在变量中看到的是一个具有 ipaddress 属性的对象,就像您正在寻找的字符串一样。您需要扩展该属性或从对象中调用该属性

$IP4Address.Ipaddress
。对于单一属性来说,前者是更简单的解决方案。

您可以将结果转换为类型加速器

[ipaddress]
。您可以调用该方法并返回您要过滤的八位字节。

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

您需要小心这种方法,因为您还应该进行一些检查以确保

$IP4Address
不为空。

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

1
投票

要仅获取

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


0
投票

$computer = Import-Csv -Path "$env:USERPROFIL

© www.soinside.com 2019 - 2024. All rights reserved.