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 地址的子网掩码。
所以我正在使用这个:
$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 地址的子网掩码。