【问题标题】:File select menu with PowerShell (not dialog box)带有 PowerShell 的文件选择菜单(不是对话框)
【发布时间】:2021-04-27 18:36:00
【问题描述】:

我这里有这个脚本:

$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"

此时我想显示所选文件的名称。我怎么能这样做?

【问题讨论】:

  • 不使用计数器,只使用数组索引。然后您可以通过$FileList[$Index] 调用任何项目。例如,lookee ... function_Get-MenuChoice [simplified] - Pastebin.com — pastebin.com/KMu2G9Dq
  • @Lee_Dailey 这对我来说有点太棘手了,我不太明白,但还是谢谢你。我很感激
  • 不客气! [grin] 我认为我的解决方案更简单,但它的基本思想相同。无论如何,我很高兴知道您的工作已按需要进行。

标签: powershell menu foreach-object


【解决方案1】:

虽然答案已被接受,但我将演示如何使用 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 优先显示在我们的对象输出之前;这是一个解决方法,您可以阅读更多关于它的信息here

最后,我们通过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

【讨论】:

  • 你的版本也很好用——感谢分享。 for 循环对于使用过 Javascript 或 C# 的人来说会很熟悉。您还可以使用 %foreach 的别名)语法和初始化器 {$i=0} 来获得更简洁的 Powershell 代码:$WavFileList = get-childitem *.wav|%{$i=0}{[PSCustomObject]@{Index = $i++;Name=$_.Name;Modified=$_.LastWriteTime;}}
【解决方案2】:

我为此目的创建了我描述的函数here

这可能对您的需求有点过头了,但您可以使用以下代码传递一组 *.wav 文件:

Show-SimpleMenu (get-childitem *.wav).Name

如有任何问题,请随时在GitHub 或此处报告。

【讨论】:

  • 哇,你做得很好。非常感谢
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 2020-03-14
  • 1970-01-01
  • 2021-09-01
  • 2010-10-21
  • 2011-04-05
  • 2011-04-29
  • 2015-11-29
相关资源
最近更新 更多