我如何将多个字符串转换为 Powershell 中的 IP 地址,以便我可以过滤掉 IPv6

How would I convert multiple strings to an IP address in Powershell so I can filter out IPv6

我必须提取一个日志文件,其中包含 windows 日志中的 IP 地址列表以及一些其他内容。我已经想出如何将其过滤为仅 IP 地址,但我正在努力将其转换为 IP 地址对象以便过滤掉 IPv6 条目。

在生产中我将使用类似这样的东西来获取日志:

$log = Get-Eventlog -Logname ABC -Source WIN-ABC -Newest 1 -ErrorAction stop

.txt 或日志文件如下所示:

Compare-DomainControllers

Customer.local
192.168.1.100
192.168.1.101
192.168.1.102 
2580:83:0:f2e:b25a:625f:c254:eb29
10.10.10.20 
etc...

我现在测试的是:

$IPFullList = Get-content -path .\test.txt (Fake Log File) $IPOnly = $IPFullList | Select-String -match "[0-9]"

这个 returns 仅包含 IPv4 和 IPv6 项目的列表,但我希望获取该列表并将条目转换为 [IPAddress] 对象,以便我可以过滤掉 IPv6 项目。

我试过了:

ConvertFrom-String -Inputobject $IPOnly

和:

Foreach ($IP in IPOnly){ [IPaddress] | Where-Object {$_.Type -ne "AAAA"} | Write-Host }

似乎没有人能做到这一点。任何想法或建议将不胜感激!

您可以执行以下操作:

$IPFullList = Get-content -Path .\test.txt
$IPOnly = [IPAddress[]]($IPFullList -match '(?:\d{1,3}\.){3}\d{1,3}').Trim()

结果将是存储在 $IPOnly 中的 IPv4 地址数组。

-match 使用正则表达式匹配,如果输入(左侧)是一个数组,将 return 匹配字符串。如果您只传递一个字符串,-match 将仅 return $true$false

Trim()方法用于去除每个字符串开头和结尾的白色space。


如果你想单独处理每个IP,你可以输入Foreach-Object:

$IPFullList = Get-content -Path .\test.txt
$IPOnly = ($IPFullList -match '(?:\d{1,3}\.){3}\d{1,3}').Trim() | Foreach-Object {
    [IPAddress]$_ # Returns the IPAddress object
}