如何使用Powershell通过值在数组中查找元素的索引

3

我在Powershell中有一个自定义对象的数组。每个对象都有一个唯一的引用,可以在数组中查找该对象,并且具有一个稍后要使用的值,该值不一定是唯一的。该数组通过以下for循环进行填充:

#Create empty array
$array1 = @()

#Populate array
foreach($otherElement in $otherArray){
  #Create custom array element
  $arrayElement = New-Object PSObject

  #Update Credential element   
  $arrayElement | Add-Member -type NoteProperty -Name 'objRef' -Value $($otherElement.getAttribute("ref") )
  $arrayElement | Add-Member -type NoteProperty -Name 'objValue' -Value $($otherElement.getAttribute("someValue") )

  #Add element to array
  $array1 += $arrayElement
}

构建完数组后,我希望以某种方式访问与正确的objRef对应的objValue。我知道可以使用-contains参数测试数组是否包含一个值,但我不知道如何获取具有该值的对象的索引。
基本上,这个数组就像一个查找表。我想要一个函数,可以输入objRef来获取objValue。
在这种情况下,objValue是System.Management.Automation.PSCredential,每个对象的密码都在运行时输入以确保安全。在工作中,我有时需要在不同的机器上安装相同的软件大约30次,并且使用相同的5个凭据,找到解决方法将帮助我远程自动化该过程。
提前致谢!

2
如果它是“充当”查找,为什么不直接使用实际的查找,例如哈希表(@{})? - Jeroen Mostert
好问题。我会查一下哈希表然后回复你! - Flash_Steel
谢谢,Jeroen。当我有参考和值对时,它的工作就像一个魅力一样。更普遍地说,您是否知道在Powershell中有哪些函数可以返回数组元素等于某个值的索引? - Flash_Steel
1个回答

7

PowerShell基于.NET,因此.NET中的所有数组在PowerShell中也同样适用。特别是,由于它们实现了IList,所以它们拥有.IndexOf方法@(10, 4, 6).indexof(6)返回值为2

当然,在你的特定情况下,哈希表更加合适,因为在哈希表中查找值的时间是常数级别的,而遍历数组则需要线性时间。这在小型数组的情况下可能不重要,但如果你正在循环处理大量数据,则会快速累积。


谢谢。我没有意识到PowerShell数组是.NET数组(在工作中学习...)。在线搜索“Powershell Array”等通常会出现大量解释基础知识的页面。 - Flash_Steel
如果数组包含字符串,则大小写可能是一个问题。由于_IndexOf_区分大小写,因此我不得不包括一个_ForEach{}_方法,该方法自PowerShell 4.0版本以来每个数组都拥有:$array1.ForEach{$_.ToLower()}.IndexOf("term") - PeterXX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接