如何使用PowerShell中的[Array] :: FindIndex方法找到String数组元素的索引?

时间:2015-08-20 21:47:41

标签: arrays powershell

另一个PowerShell noob问题。

我有一个包含企业名称的字符串数组,我正在编写一个脚本,它遍历目录的文件夹,并将文件夹名称与数组中包含的名称进行比较。当我找到匹配项时,我需要获取找到匹配项的数组索引。我使用以下代码成功完成了完全匹配:

foreach($file in Get-ChildItem $targetDirectory)
{
    if($businesses -like "$file*")
    {
        $myIndex = [array]::IndexOf($businesses, [string]$file)
    }
}

我使用-like "$file*"的原因是因为有时候企业的名称有“LLC”或“INC”或类似的东西,当我们命名文件夹时偶尔也不包括(反之亦然)。我想修改我的$myIndex行来查找这些索引。

我正在尝试使用

 $myIndex = [array]::FindIndex($Merchant, {args[0] -like "$file*"})

但我收到了错误

无法找到“FindIndex”的重载和参数计数:“2”。

我尝试使用 [Predicate[string]]{args[0] -like "$file*"} 来投射第二个参数,但得到相同的结果。我已经阅读了该方法的文档,但我的一个基本问题是我不理解System.Predicate类型。我甚至不确定我是否正确地写它;我发现了一个类似但使用[int]的示例。也许我说这一切都错了,但我觉得我很接近,无法在任何地方找到丢失的拼图。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

[Array]::FindIndex($Merchant, [Predicate[string]]{})仅在$Merchant类型为string[]时才有效:

$Merchant是一个字符串数组,有效:

PS C:\> $Merchant = 1,2,3 -as [string[]]
PS C:\> [array]::FindIndex($Merchant,[Predicate[String]]{param($s)$s -eq "3"})
2

$MerchantInt32的数组,不起作用:

PS C:\> $Merchant = 1,2,3 -as [int[]]
PS C:\> [array]::FindIndex($Merchant,[Predicate[String]]{param($s)$s -eq "3"})
Cannot find an overload for "FindIndex" and the argument count: "2".
At line:1 char:1
+ [array]::FindIndex($Merchant,[Predicate[String]]{param($s)$s -eq "3"})
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

投射到Predicate[int]时工作正常:

PS C:\> [array]::FindIndex($Merchant,[Predicate[int]]{param($s)$s -eq 3})
2