我正在为一家公司编写一个伪搜索引擎,让他们找到一些歌曲,然后选择它们并用它们做些什么。我可以显示和选择内容,直到返回只给我一首歌。当您尝试选择那首歌时,返回的错误是:
Unable to index into an object of type System.IO.FileInfo.
At C:\Users\adammcgurk\Documents\WorkOnSearch.ps1:83 char:20
+$Selected = $Items[ <<<< $Input - 1]
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
以下是相关代码的一部分:
$SearchInput = Read-Host "Enter song name here:"
$Items = Get-ChildItem C:\Users\adammcgurk\Desktop\Songs -Recurse -Filter *$SearchInput*
$Index = 1
$Count = $Items.Count
foreach ($Item in $Items) {
$Item | Add-Member -MemberType NoteProperty -Name "Index" -Value $Index
$Index++
}
$Items | Select-Object Index, Name | Out-Host
$Input = Read-Host "Select an item by index number (1 to $Count)"
$Selected = $Items[$Input - 1]
Write-Host "You have selected $Selected"
最终目标是能够在只返回一首歌时选择单曲。谢谢你的帮助!
答案 0 :(得分:2)
有几个观察结果,您使用$ input作为变量名,但这是一个未正确使用的自动变量。 (get-help about_automatic_variables)更改变量的名称。
另一个问题是$ Items可能是也可能不是数组,但你试图以任何一种方式对其进行索引。您可以在创建时将$ Items显式转换为数组
#This will ensure that the return value is an array regardless of the number of results
$Items = @(Get-ChildItem C:\Users\adammcgurk\Desktop\Songs -Recurse -Filter *$SearchInput*)
或者您可以在询问之前检查$项目
if($Items -is [System.Array]){
#Handle choice selection
}else{
#only one object
$Items
}
我还要小心使用Write-Host。如果你查一下,你可以挖掘兔子洞,但通常Write-Host不是你应该使用的输出选择。