问题描述
我这里有这个脚本:
$directory = "C:\New Folder"
$counter = 1
Set-Location $directory
#Menu
Write-Host "==========" -BackgroundColor DarkGreen
Write-Host "===MENU===" -BackgroundColor DarkGreen
Write-Host "==========" -BackgroundColor DarkGreen
#Shows only .wav files and it order them
Get-ChildItem -Name -Include *.wav | ForEach-Object {Write-Host "[$counter] " -ForegroundColor Green -NoNewLine; Write-Host "$_"; $counter++}
Write-Host ""
$input = Read-Host -Prompt "Select a file from the menu"
Clear-Host
Write-Host "You have just selected: $input"
解决方法
我为此目的创建了函数,我描述了 here。
这对于您的需求来说可能有点矫枉过正,但您可以使用以下代码传递一组 *.wav 文件:
Show-SimpleMenu (get-childitem *.wav).Name
请随时在 GitHub 或此处报告任何问题。
,虽然答案已被接受,但我将演示如何使用 for
循环从文件中进行选择。
我们首先必须像这样使用 Get-ChildItem
收集文件:
$WavFiles = Get-ChildItem -Filter "*.wav"
注意我如何不只是将范围缩小到仅名称?这为我们提供了更多的工作选项,例如将上次写入时间添加到我们的选择菜单中,以便我们可以查看上次处理时间。
接下来,我们将创建一个 PSCustomObject
来存储我们的结果,并使用 for
循环列出它们,根据我们在 {{1} 中收集的项目为每个文件名分配一个数字}}。
$WavFiles
如果您熟悉如何从数组 ( $(for($i=0; $i -lt $WavFiles.Count; $i++){
[PSCustomObject]@{
'File Name' = "${i}: $($WavFiles.BaseName[$i])"
'Last Write Time' = $WavFiles.LastWriteTime[$i]
}
}) | Out-Host
) 中进行选择,您应该能够通过分配它,它对应的数组编号。由于 $array[3]
优先并显示在我们对象的输出之前,因此添加了 $WavFiles
;这是一个解决方法,您可以阅读更多相关信息here。
最后,我们通过 $() | Out-Host
将输入值分配给 Read-Host
来请求用户输入,我们将再次使用它,使用它在我们的 {{ 集合中分配的编号来引用相应的文件1}}
Read-Host
$input
变量成为选定的数字,这就是我们可以使用它来引用数组中相应值的原因。
一切都像这样:
$WavFiles
输出:
$input = Read-Host -Prompt "Select a file from the menu" Clear-Host Write-Host "You have just selected: $($WavFiles[$input])"