Powershell 获取WmiObject Win32_网络适配器配置-匹配失败

Powershell 获取WmiObject Win32_网络适配器配置-匹配失败,powershell,ip-address,subnet,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]

所以我用这个:

$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
返回的数组。当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
因此,只需使用
|选择-first 1
,您就会得到预期的结果



我提醒您在此处使用
-match
。了解
-match
-replace
支持正则表达式模式字符串。因此,如果字符串中包含正则表达式元字符,则可能会得到意外的结果

之所以发生这种情况,是因为$IPA实际上是一个对象数组。 运行
Get NetIPAddress | Where Object InterfaceAlias-eq“MyPortName”
时,它返回一个MSFT\u NetIPAddress类型的CIM实例数组。 当您通过运行
$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地址的子网掩码。

我现在正在检查这是否是您的问题,但
-match
支持正则表达式,因此任何元字符都可能导致冲突。如果是为了精确匹配,只需使用
-eq
。也可能得到不止一个结果。当您将$ipa打印到控制台时,
$ipa.GetType().FullName
偶然显示
System.Object[]
?当我在控制台中仅显示$ipa时,它显示10.45.22.100,但当我执行$ipa.GetType().FullName时,它显示System.Object[]。我也不能做-eq,因为IP是这样列出的:IPAddress{10.45.22.1002001:0db8:85a3:0000:0000:8a2e:0370:7334}Nice。谢谢工作完美。:)