为什么我不能在Powershell中的foreach循环中查找数组索引?

时间:2015-08-07 19:49:33

标签: arrays powershell csv

这里的第一个问题请原谅我,如果我犯了任何错误,我会尽力遵守指导原则。

我正在尝试编写一个PowerShell脚本,该脚本通过CSV文件从我读入的数据中填充两个数组。我使用数组交叉引用目录名称以重命名每个目录。一个数组包含目录的当前名称,另一个数组包含新名称。

到目前为止,这一切似乎都在起作用。我成功创建并填充了数组,并使用短输入和索引查找来检查我的工作,我可以在一个数组中搜索当前名称,并成功从第二个数组中检索正确的新名称。但是,当我尝试在遍历每个目录名的foreach循环中实现此代码时,我无法查找数组索引(它会一直返回-1)。

我在这里找到的第一个答案中使用了代码作为我的模板。 Read a Csv file with powershell and capture corresponding data。这是我对输入查找的修改,它可以正常工作:

$input = Read-Host -Prompt "Merchant"

if($Merchant -contains $input)
{
    Write-Host "It's there!"
    $find = [array]::IndexOf($Merchant, $input)
    Write-Host Index is $find
}

这是我的foreach循环尝试使用索引查找,但每次都返回-1。但是我知道它找到了这个文件,因为它输入了if语句并打印了#34;它就在那里!"

foreach($file in Get-ChildItem $targetDirectory)
{
    if($Merchant -contains $file)
    {
        Write-Host "It's there!"
        $find = [array]::IndexOf($Merchant, $file)
        Write-Host Index is $find
    }
}

我无法弄明白。我是一个PowerShell新手,所以它可能是一个简单的语法问题,但似乎应该可行,我无法找到我出错的地方。

1 个答案:

答案 0 :(得分:2)

您的问题似乎是$Merchant是文件名的集合(类型为string),而$fileFileInfo对象。

-contains运算符期望$file是一个字符串,因为$Merchant是一个字符串数组,并且按预期工作(因为FileInfo.ToString()只返回文件名)

IndexOf()并非如此宽容。它承认$Merchant中的所有项都不属于FileInfo类型,因此它永远不会找到$file

您可以直接引用文件名:

[array]::IndexOf($Merchant,$file.Name)

或,如@PetSerAl所示,将$file转换为字符串:

[array]::IndexOf($Merchant,[string]$file)
# or 
[array]::IndexOf($Merchant,"$file")
# or 
[array]::IndexOf($Merchant,$file.ToString())

最后,你可以直接在数组上调用IndexOf(),不需要使用静态方法:

$Merchant.IndexOf($file.Name)