$D_Subnet_1
如果您需要考虑上面查询网络接口的PowerShell代码段,并根据匹配的子网检查接口名称是否等于" Ethernet0"产生一个布尔值。
我目前正在使用的服务器的IPAddress与interface_alias=True
的前三个八位字节匹配,如果我像这样定位$D_Subnet_1
,则生成 $result = (Get-NetAdapter |
? status -eq 'up' |
Get-NetIPAddress -ErrorAction 0 |
? PrefixOrigin -eq 'Manual' |
? IPAddress -match $D_Subnet_1 |
foreach { $Ethernet0 -eq $_.InterfaceAlias})
Write-Host "interface_alias=$result"
的值:
$All_Subnets
但是如果我尝试使用 $result = (Get-NetAdapter |
? status -eq 'up' |
Get-NetIPAddress -ErrorAction 0 |
? PrefixOrigin -eq 'Manual' |
? IPAddress -match $All_Subnets |
foreach { $Ethernet0 -eq $_.InterfaceAlias})
Write-Host "interface_alias=$result"
数组运行命令:
interface_alias=
它只生成-match
而没有任何价值。
我尝试将-contain
和like
换成XmlEnhancedServer
但没有运气。我该如何解决这个问题?
答案 0 :(得分:3)
你在这里使用了错误的比较:
Where-Object -Property 'IPAddress' -Match @('10.30.2','10.40.2')
您需要抓住前3个八位字节才能正确进行此比较:
Where-Object -FilterScript { $_.IPAddress.Substring(0, $_.IPAddress.LastIndexOf('.')) -in $All_Subnets }
如果你不是版本3+,只需交换比较方并将操作符更改为-contains
答案 1 :(得分:3)
PowerShell有两个处理集合的运算符:-contains
和-in
。
其他运营商,我认为所有运营商都无法使用集合,但PowerShell假装可以。它们可用于两种类型的匹配 - “将这两个单独的事物相互比较并输出结果”,即$a -eq $z
或$a -match $z
,输出为boolean true / false - 它有用吗?
它可以做“将这个集合的东西与这个单独的东西进行比较,输出过滤集合到只有那些有用的东西”。这是($a, $b, $c) -eq $z
或($a, $b, $c) -match $z
,输出是测试工作的内容:($b, $c)
。具体来说,左边的集合,右边的单个东西。
绊倒你的是-match
进行正则表达式测试,正则表达式可以匹配子串。所以你的直接子网测试正在进行"10.0.1.2" -match "10.0.1"
并且它可以工作。但是你第二次尝试使用数组是完全错误的,因为将数组放在右边会改变发生的事情:
IPAddress -match $All_Subnets
变成“-match与右边的正则表达式一起工作,数组被强制转换为字符串,它与每个项目之间的空格连接在一起,变为:10.0.1 10.0.2 10.11.1 10.11.2 10.12.1 10.12.2
现在你有"10.0.1.2" -match "10.0.1 10.0.2 10.11.1 10.11.2 10.12.1 10.12.2"
,但事实并非如此。
这也解释了为什么-in
和-contains
不起作用 - 因为他们不正在进行正则表达式测试,并且无法匹配子字符串。他们查找IPAddress是否完全在子网列表中 - 它不是,因为它们没有最后一个八位字节。
@TheIncorrigible1的答案解决了这个问题,方法是将IP地址转换为前三个八位字节,然后在数组中查找,这是一个可以工作的测试。
另一种方法是循环遍历数组的内容并测试每一个。 e.g。
? { $All_Subnets | foreach { $IPAddress -match $_ } } |
“哪里(根据IP测试每个子网有任何输出)”。
这假设您的所有子网都是/ 24,这可能是好的,也可能不是。
您可以改为将阵列更改为包含网络地址和子网掩码,并进行“正确”的子网检查,例如:像http://get-powershell.com/post/2010/01/29/Determining-if-IP-addresses-are-on-the-same-subnet.aspx
这样的东西