在Powershell数组中解析RegEx IP匹配

AK3*_*K37 2 regex arrays powershell split match

我试图找出如何解析IP地址的数组.到目前为止,我已经解决了如何将IP解析为DNS主机名的问题:

Function Get-IP-Hostname
{
    Param([string[]]$array)

    $array.length

    foreach ($element in $array) 
    {
        $hname = [System.Net.Dns]::GetHostByAddress($element).HostName 

        $regex = "[regex] (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"

        @{$element = $hname}
     }
 } 
Run Code Online (Sandbox Code Playgroud)

当我执行

Get-IP-Hostname 192.168.150.xx 192.168.151.xx  
Run Code Online (Sandbox Code Playgroud)

有一堆IP我必须使用逗号分割,分隔字符串 - 我的RegEx似乎没有逗号分裂.

我想获得这个输出:

> Name                           Value                                  
> 
> ----                           -----                                                                                                                                                                                                                               
> 192.168.150.xx                 ank70dom07.akgroup.com                                                                                                                                                                                                             
> 192.168.151.xx                 ank70dom07.akgroup.com
Run Code Online (Sandbox Code Playgroud)

我是PowerShell的新手,非常感谢任何帮助.

谢谢!

bri*_*ist 5

[ValueFromRemainingArguments()]如果您希望能够以这种方式传递它们(作为额外参数),请使用您的参数.

还有一种比正则表达式更好的方法来验证IP地址:只需将其转换为[ipaddress].

function Get-IP-Hostname {
[CmdletBinding()]
param(
    [Parameter(ValueFromRemainingArguments = $true)]
    [String[]]
    $IPAddress
)

    foreach ($element in $IPAddress) {
        $ip = $element -as [Net.IPAddress]
        if ($ip) {
            @{$element = [Net.Dns]::GetHostByAddress($element).HostName}
        } else {
            # handle invalid IP (or don't)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过将参数设置为ipaddresses([ipaddress[]])数组来进一步简化此操作,因为字符串的转换将自动完成:

function Get-IP-Hostname {
[CmdletBinding()]
param(
    [Parameter(ValueFromRemainingArguments = $true)]
    [IPAddress[]]
    $IPAddress
)

    foreach ($ip in $IPAddress) {
        @{$ip = [Net.Dns]::GetHostByAddress($ip.IPAddressToString).HostName}
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的障碍是,即使其中一个传入的地址无效,整个调用也将失败.所以这取决于你想做什么.

还有一个建议:每次都不要返回一个包含单个元素的新哈希表.它看起来在屏幕上,但它不是你真正想要的.您可以使用单个哈希表修复它,但我建议更好一些:返回[IPAddress]具有添加HostName属性的对象:

function Get-IP-Hostname {
[CmdletBinding()]
param(
    [Parameter(ValueFromRemainingArguments = $true)]
    [String[]]
    $IPAddress
)

    foreach ($element in $IPAddress) {
        $ip = $element -as [Net.IPAddress]
        if ($ip) {
            $ip |
                Add-Member -NotePropertyName HostName -NotePropertyValue ([Net.Dns]::GetHostByAddress($ip.IPAddressToString).HostName) -PassThru
        } else {
            # handle invalid IP (or don't)
        }
    }
}

$results = Get-IP-Hostname 8.8.4.4 8.8.8.8

$results | fl * # all properties

$results | ft IPAddressToString,HostName # demonstrating what you want
Run Code Online (Sandbox Code Playgroud)