使用 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
我这里有这个脚本:
$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