2017-05-31 34 views
0

所以我用这个:获取-WmiObject可以Win32_NetworkAdapterConfiguration的-Match失败

$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为空。如果我硬编码IP地址它的工作原理:

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

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

编辑:被报告的IP地址具有IPv4和IPv6,这就是为什么我试图做 - 与IPv4匹配。

+0

我现在检查如果这是你的问题,但'-match'支持正则表达式,所以任何元字符都可能导致冲突。如果这是一个完全匹配,只需使用'-eq'instead。也可能获得不止一个结果。在打印到控制台时,'$ ipa'看起来像什么? – Matt

+0

'$ IPA.GetType()。FullName'偶尔显示'System.Object []'? – Matt

+0

当我在控制台中做$ IPA时,它显示10.45.22.100,但是当我做$ IPA.GetType()。全名时它显示System.Object []。 另外我不能做-eq,因为IP是这样列出的: IPAddress {10.45.22.100,2001:0db8:85a3:0000:0000:8a2e:0370:7334} – PSNewb

回答

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支持正则表达式模式字符串。所以如果你的字符串中有正则表达式元字符,你可能会得到意想不到的结果。

+0

不错。谢谢!完美工作。 :) – PSNewb

0

发生这种情况是因为$ IPA确实是一个对象数组。 当您运行Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName"时,它将返回一个类型为MSFT_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地址的子网掩码。

相关问题