使用 PowerShell 的文件 select 菜单(不是对话框)

File select menu with PowerShell (not dialog box)

我这里有这个脚本:

$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 循环将它们列出来,根据我们在 $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 集合时发生的事情通过分配它,它对应的数组编号。添加 $() | Out-Host 是因为 Read-Host 优先显示在我们对象的输出之前;这是一个解决方法,您可以阅读更多相关信息

最后,我们要求用户输入我们的 Read-Host 将输入值分配给 $input 我们将再次使用它,使用它在我们的集合中分配的编号引用相应的文件$WavFiles

$input = Read-Host -Prompt "Select a file from the menu" Clear-Host Write-Host "You have just selected: $($WavFiles[$input])"

$input变量成为选择的数字,这就是为什么我们可以用它来引用数组中的相应值。

一切都是这样的:

#$directory = "C:\New Folder"
#Set-Location $directory

$WavFiles = Get-ChildItem -Filter "*.wav"
    
    $(for($i=0; $i -lt $WavFiles.Count; $i++){
        [PSCustomObject]@{
            'File Name'       = "${i}: $($WavFiles.BaseName[$i])"
            'Last Write Time' = $WavFiles.LastWriteTime[$i]
                }
            }) | Out-Host

$input = Read-Host -Prompt "Select a file from the menu"
Clear-Host
Write-Host "You have just selected: $($WavFiles[$input])"

输出:


File Name                 Last Write Time      
---------                 ---------------      
0: Eula                   3/2/2011 9:48:57 AM  
1: psversion              3/2/2011 9:48:56 AM  
2: readme                 11/6/2020 12:57:53 PM
3: ThirdPartyNoticesBySHS 2/27/2021 10:31:01 PM
4: WindowsCodecsRaw       3/18/2019 10:46:13 PM