Get-WmiObject Win32_NetworkAdapterConfiguration - 匹配失败

Get-WmiObject Win32_NetworkAdapterConfiguration -Match failing

所以我正在使用这个:

$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 进行匹配的原因。

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

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

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

解决这个问题的方法很少。一个简单的方法是在您的查询中始终 return -First 结果。

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

因此只需使用 | select -first 1,您应该会得到预期的结果。


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

发生这种情况是因为 $IPA 实际上是一个对象数组。 当您 运行 Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName" 时,它 returns 类型为 MSFT_NetIPAddress 的 CIM 实例数组。 当您通过 运行ning $IPA = (Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName").IPv4Address 请求 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 地址的子网掩码。