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。谢谢工作完美。:)