我正在尝试解决如何解析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我必须使用逗号分割,分隔字符串 - 我的RegEx似乎没有逗号分割。
我正在尝试获得此输出:
> Name Value
>
> ---- -----
> 192.168.150.xx ank70dom07.akgroup.com
> 192.168.151.xx ank70dom07.akgroup.com
我是PowerShell的新手,非常感谢任何帮助。
谢谢!
答案 0 :(得分: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)
}
}
}
您可以通过将参数设置为ipaddresses([ipaddress[]]
)数组来进一步简化此操作,因为字符串的转换将自动完成:
function Get-IP-Hostname {
[CmdletBinding()]
param(
[Parameter(ValueFromRemainingArguments = $true)]
[IPAddress[]]
$IPAddress
)
foreach ($ip in $IPAddress) {
@{$ip = [Net.Dns]::GetHostByAddress($ip.IPAddressToString).HostName}
}
}
这里的障碍是,如果传入的其中一个地址无效,整个调用将失败。所以这取决于你想做什么。
还有一个建议:每次都不要返回一个包含单个元素的新哈希表。它看起来在屏幕上,但它不是你真正想要的。您可以使用单个哈希表修复它,但我建议更好:返回[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
答案 1 :(得分:1)
删除$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]
答案 2 :(得分:0)
您可以使用-match
参数。 E.g。
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]} }
您还应该查看llink更详细地解释-matches
。
希望有所帮助。
答案 3 :(得分:0)
使用“ResolveIPs”功能并使用RegEx公式仅提取IP,对RegEx使用“.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。