我正在编写一个脚本,用于更新Windows 7计算机上的DNS服务器列表,以获取为默认路由传递流量的接口。
我选择了
的路线表条目$defaultgw_routes = Get-WMIObject Win32_IP4RouteTable |
Where-Object {$_.Destination -eq "0.0.0.0"}
并假设使用Win32_NetworkAdapterConfiguration
获得的接口列表位于$interfaces
变量中,定义为
$interfaces = Get-WmiObject Win32_NetworkAdapterConfiguration
我希望在$route.InterfaceIndex -eq $interface.Index
条件下加入这两个列表。但是我注意到索引不匹配。
路由表具有以下接口定义:
C:\Users\user01>route print if 11
===========================================================================
Interface list
....
13...08 00 27 8d 7e 19 ......Intel(R) PRO/1000 MT #2
11...08 00 27 a4 16 ad ......Intel(R) PRO/1000 MT
12...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
...
但是$interface
列表有
ServiceName : E1G60
Description : Intel(R) PRO/1000 MT
Index : 7
ServiceName : tunnel
Description : Tunnel adapter Microsoft Teredo
Index : 11
ServiceName : E1G60
Description : Intel(R) PRO/1000 MT #2
Index : 13
在两个列表Intel(R) PRO/1000 MT #2
中都有索引13,但Intel(R) PRO/1000 MT
在一个列表中为11,在另一个列表中为7。这种“七一一”差异可能是什么原因?
从InterfaceIndex
属性的description我预计索引应该匹配。
InterfaceIndex
此路由的下一跳的IP地址。此属性中的值与InterfaceIndex属性中的值相同 Win32_NetworkAdapter和。的实例 表示网络接口的Win32_NetworkAdapterConfiguration 该路线的下一跳。
答案 0 :(得分:2)
以下代码段显示了使用-in
comparison operator加入两个列表的可能方法。
$filterDest = "Destination = '0.0.0.0'"
$defaultgw_routes = Get-WMIObject Win32_IP4RouteTable -Filter $filterDest
$filterIPA = "IPEnabled = True"
$interfaces = Get-WmiObject Win32_NetworkAdapterConfiguration -Filter $filterIPA
'### interfaces ###'
$interfaces |
Where-Object {$_.InterfaceIndex -in $defaultgw_routes.Interfaceindex } |
Select-Object [a-z]* -ExcludeProperty PSComputerName, Scope, Path, Options,
ClassPath, Properties, SystemProperties, Qualifiers, Site, Container
'### routes ###'
$defaultgw_routes |
Where-Object {$_.InterfaceIndex -in $interfaces.Interfaceindex } |
Select-Object [a-z]* -ExcludeProperty PSComputerName, Scope, Path, Options,
ClassPath, Properties, SystemProperties, Qualifiers, Site, Container
请注意
Where-Object
参数替换-Filter
的管道,以指定用作过滤器的 Where
子句。使用WMI
Query Language (WQL)和Select-Object
只是为了避免重复输出众所周知的属性。答案 1 :(得分:1)
我认为您现在应该检查一下以了解它们之间的区别:
$interfaces = Get-WmiObject Win32_NetworkAdapterConfiguration | select InterfaceIndex, Index
$defaultgw_routes = Get-WMIObject Win32_IP4RouteTable |?{$_.Destination -eq "0.0.0.0"} | Select InterfaceIndex,Index
$interfaces
$defaultgw_routes