Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 解析Powershell数组中的正则表达式IP匹配_Arrays_Regex_Powershell_Split_Match - Fatal编程技术网

Arrays 解析Powershell数组中的正则表达式IP匹配

Arrays 解析Powershell数组中的正则表达式IP匹配,arrays,regex,powershell,split,match,Arrays,Regex,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 $reg

我正在尝试解决如何解析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}
     }
 } 
当我执行

Get-IP-Hostname 192.168.150.xx 192.168.151.xx  
对于一堆IP,我必须使用逗号来拆分,分隔字符串-如果没有逗号,我的正则表达式似乎不会拆分

我正在尝试获得以下输出:

> Name                           Value                                  
> 
> ----                           -----                                                                                                                                                                                                                               
> 192.168.150.xx                 ank70dom07.akgroup.com                                                                                                                                                                                                             
> 192.168.151.xx                 ank70dom07.akgroup.com
我是PowerShell的新手,非常感谢您的帮助


谢谢

您可以使用
-match
参数。例如

PS C:\> "192.168.0.1" -match "(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"  
True
如果找到匹配项,则返回
True
。您可以从
$Matches
变量中检索匹配结果:

PS C:\> $Matches

Name                           Value                                                                                                                      
----                           -----                                                                                                                      
1                              192.168.0.1                                                                                                                
0                              192.168.0.1                                                                                                                
$Matches
是一个数组(包含正则表达式匹配组),因此您可以通过
[]
-运算符检索特定值

PS C:\> $Matches[1]
192.168.0.1  
您还可以通过管道传输多个字符串,并检查其中一个字符串是否与正则表达式匹配:

PS C:\>"192.168.0.23", "10.0.0.1" | % { if ($_ -match "(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})") { $Matches[0]} }
您还应该更详细地检查此解释
-匹配项


希望这能有所帮助。

摆脱
$Array
参数,使用自动变量
$Args
。它已经是接收到的所有参数的数组

PS C:\> Function Get-HostnameFromIP { $Args }
PS C:\> Get-HostnameFromIP 134.222.659.0 148.398.388.299
134.222.659.0
148.398.388.299
这种方法的唯一缺陷是,您需要将参数强制转换为您想要的参数(字符串)
[Net.Dns]::GetHostByAddress(“$Element”)


编辑:测试了这种方法,并且在PSv5.1中,IPv4地址被解释为
[String]
,如果希望能够以这种方式传递它们(作为额外参数),请在参数上使用
[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)
        }
    }
}
只需将参数设置为一个ipaddress数组(
[ipaddress[]]
),就可以进一步简化此过程,因为字符串的转换将自动完成:

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

    foreach ($ip in $IPAddress) {
        @{$ip = [Net.Dns]::GetHostByAddress($ip.IPAddressToString).HostName}
    }
}
这里的障碍是,即使传入的地址中有一个无效,整个调用也会失败。所以这取决于你想做什么

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

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
使用函数“ResolveIPs”并使用正则表达式仅提取IP,对正则表达式使用“.matches”,然后使用“TRY”解析主机名。最后将结果输出到数组中

function ResolveIPs {
    cls #clear console
    $regex = [regex] "\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}"
    $table = @() 

    foreach ($argument in $args){ 
        if ($argument -match $regex){ 
            $tempstr = $regex.Matches($argument) | %{ $_.value } 

            foreach ($value in $tempstr){
                $tablevalue = "" | select IP, Hostname 
                try {
                    $result = [Net.Dns]::GetHostByAddress($value).HostName

                    $tablevalue.IP = $value 
                    $tablevalue.Hostname = $result 
                    $table = $table + $tablevalue 
                }
                catch [exception] { 
                    $tablevalue.IP = $value 
                    $tablevalue.Hostname = "Error resolving IP address" 
                    $table = $table + $tablevalue
                }
            }  #endof foreach value
        }#end of IF
    }#endof foreach argument

    $table #output of table with results
}#end of function

现在,您可以将此脚本作为模块(.psm1)导入,并在函数“ReolveIPs”之后添加任何IP。

我希望能够将正则表达式保留在
get IP Hostname
函数中,因此我可以只粘贴一组IP,它将拾取它并将其放入错误中,而不需要逗号。例如,
PS C:\>192.168.0.23 djfhsd 10.0.0.1
不知道该属性,很好!