我正在尝试通过
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}
呢?有更好的解决办法吗?
您不需要分割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]
。您可以调用该方法并返回您要过滤的八位字节。
$IP4Address = Test-Connection -Computer SERVER -Count 1 | Select -ExpandProperty IPV4Address
([ipaddress]$IP4Address).GetAddressBytes()[1]
您需要小心这种方法,因为您还应该进行一些检查以确保
$IP4Address
不为空。
if($IP4Address){([ipaddress]$IP4Address).GetAddressBytes()[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
$computer = Import-Csv -Path "$env:USERPROFIL