这里的第一个问题请原谅我,如果我犯了任何错误,我会尽力遵守指导原则。
我正在尝试编写一个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新手,所以它可能是一个简单的语法问题,但似乎应该可行,我无法找到我出错的地方。
答案 0 :(得分:2)
您的问题似乎是$Merchant
是文件名的集合(类型为string
),而$file
是FileInfo
对象。
-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)