尽管已接受答案,但我将演示如何使用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