Get-WmiObject Win32_NetworkAdapterConfiguration -Match失败

时间:2017-05-31 19:24:18

标签: powershell ip-address subnet

所以我正在使用它:

$IPA = (Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName").IPv4Address

然后我想使用以下内容来获取该IP的子网掩码:

$IPInfo = (Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object IPAddress -Match $IPA)

其次是:

$SubMask = $IPInfo.IPSubnet[0]

但是因为$ IPInfo为空而失败了。如果我硬编码IPAddress,它可以工作:

$IPInfo = (Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object IPAddress -Match 10.45.22.100)

但端口IP总是不同的。为什么不将$ IPA作为匹配参数?

编辑:报告的IP地址同时具有IPv4和IPv6,这就是我尝试做的原因 - 针对IPv4进行匹配。

2 个答案:

答案 0 :(得分:1)

正如我们在评论中发现的那样,您正在为$IPA返回一个数组。它在控制台中看起来很好,因为PowerShell展开数组以显示所有元素。因为只有一个它有误导性。

((Get-NetIPAddress | Where-Object InterfaceAlias -eq "Local Area Connection").IPv4Address).gettype().fullname
System.Object[]

可能它试图匹配“System.Object []”,这就是为什么你没有得到你想要的结果。

有很多方法可以解决这个问题。一个简单的方法是始终在查询中返回-First结果。

(Get-NetIPAddress | Where-Object InterfaceAlias -eq "Local Area Connection").IPv4Address | select -first 1).gettype().fullname

所以只需使用| select -first 1即可获得您期望的结果。

我提醒在这里使用-match。了解-match-replace支持正则表达式模式字符串。因此,如果你的字符串中有正则表达式元字符,你可能会得到意想不到的结果。

答案 1 :(得分:0)

这是因为$ IPA实际上是一个对象数组。 运行Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName"时,它返回MSFT_NetIPAddress类型的CIM实例数组。 当您通过运行IPv4Address请求$IPA = (Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName").IPv4Address成员时,阵列仍然存在,但不显示没有IPv4Address的阵列元素。 看一下下面的例子。

$NetIPAddresses = (Get-NetIPAddress | where {$_.InterfaceAlias -eq "Ethernet" -and $_.AddressFamily -eq "IPv4"})
foreach ($NetIPAddress in $NetIPAddresses) {
   $IPA = $NetIPAddress.IPv4Address
   $IPInfo = (Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object IPAddress -Match $IPA)
   $IPInfo.IPSubnet[0]
}

这将显示给定接口上每个IPv4地址的子网掩码。