PowerShell-如何通过变量标识数组上匹配的字符串索引 [英] Powershell- How to identify via variable, the matched string index on a array
问题描述
$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屋!