如何从PowerShell的匿名PSCustomObject属性中提取IPv4地址
提取PSCustomObject中的IPv4地址字符串
你可以通过以下两种常用方法,从IPAddresses属性(实际为字符串数组类型)中提取IPv4地址:
方法一:正则表达式匹配
利用正则匹配标准IPv4的点分十进制格式,快速过滤目标地址:
# 获取包含IPAddresses的对象 $vmNetworkInfo = Get-VM -Name Linux | Select-Object -ExpandProperty networkadapters | Select-Object IPAddresses # 过滤出IPv4地址 $ipv4List = $vmNetworkInfo.IPAddresses | Where-Object { $_ -match '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$' } # 查看结果 $ipv4List
正则表达式^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$会匹配符合xxx.xxx.xxx.xxx格式的字符串,适合快速筛选场景。
方法二:.NET类严谨判断
借助System.Net.IPAddress类解析地址,通过地址族判断是否为IPv4,能排除格式无效的伪IP:
$vmNetworkInfo = Get-VM -Name Linux | Select-Object -ExpandProperty networkadapters | Select-Object IPAddresses $ipv4List = $vmNetworkInfo.IPAddresses | ForEach-Object { try { $parsedIp = [System.Net.IPAddress]::Parse($_) # 判断是否为IPv4地址族 if ($parsedIp.AddressFamily -eq 'InterNetwork') { $_ } } catch { # 跳过解析失败的无效地址 } } $ipv4List
这种方法更可靠,比如能排除256.1.1.1这类格式错误的地址。
补充说明
如果虚拟机有多块网卡,上述代码会提取所有网卡的IPv4地址;若只需单块网卡的地址,可在获取网卡时添加筛选,例如:
# 只取第一块网卡的信息 $vmNetworkInfo = Get-VM -Name Linux | Select-Object -ExpandProperty networkadapters -First 1 | Select-Object IPAddresses
内容的提问来源于stack exchange,提问作者user67329
相关产品推荐
相关产品推荐

