PowerShell-如何通过变量标识数组上匹配的字符串索引 [英] Powershell- How to identify via variable, the matched string index on a array

查看:45
本文介绍了PowerShell-如何通过变量标识数组上匹配的字符串索引的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

$array = @('blue','red','purple','pink')
$array2 = @('brown','red','black','yellow')

$array | ForEach-Object {
    if ($array2 -contains $_) {
        Write-Host "`$array2 contains the `$array1 string [$_]"
    }
}

如何获取匹配字符串的索引?

推荐答案

PowerShell的-in/-contains运算符允许您测试集合中给定值的包容(给定值是否为集合中的元素),但不直接支持仅使用PowerShell自己的功能获取元素的索引

对于.NET数组(如您的问题[1]中创建的数组),您可以使用它们的.IndexOf()实例方法,该方法根据当前区域性使用区分大小写的比较;例如:

$array.IndexOf('red')  # -> 1; case-SENSITIVE, current-culture comparison

请注意,PowerShell本身通常不区分大小写,与-eq(以及在其他上下文中)一起使用不变区域性进行比较。


不区分大小写的解决方案基于不变区域性,使用数组类型的静电[Array]::FindIndex()方法

$array = 'blue', 'ReD', 'yellow'
[Array]::FindIndex($array, [Predicate[string]] { 'red' -eq $args[0] }) # -> 1
请注意,通过委托给PowerShell脚本挡路({ ... }),其中每个元素($args[0])都使用-eq针对目标值进行测试,您隐式获得了PowerShell的不区分大小写、区域性不变的行为。

或者,您可以使用-ceq运算符进行区分大小写的(但仍是区域性不变)匹配。
($args[0].Equals('red', 'CurrentCulture')将为您提供与上述.IndexOf()解决方案等效的行为)。

通常,此方法启用更复杂的匹配技术,例如使用基于正则表达式的-match运算符或基于通配符的-like运算符。


以上解决方案查找第一个匹配元素的索引(如果有)。

若要查找最后匹配元素的索引,请使用:

注意:虽然有一个[Array]::FindAll()方法可以返回满足给定谓词(条件)的所有元素,但是没有直接方法可以查找所有索引


[1]请注意,您不需要@()array-subexpression operator要从单个枚举的元素创建数组:使用,枚举它们,仅array constructor operator就足够了:
$array = 'blue','red','purple','pink'

这篇关于PowerShell-如何通过变量标识数组上匹配的字符串索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆