PowerShell布尔值

时间:2018-03-20 20:01:33

标签: powershell boolean

$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而没有任何价值。

我尝试将-containlike换成XmlEnhancedServer但没有运气。我该如何解决这个问题?

2 个答案:

答案 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

这样的东西