我正在编写一个Powershell脚本,它将向用户展示SQL查询的选项,以便运行和抓取报告。我有一个充满这些查询的完整目录,但不确定如何动态列出名称,并在终端中对它们进行编号。我知道我可以硬编码它们,但是我想为以后添加或删除的脚本负责。
项目的文件夹结构如下,我已经完成并测试了调用和执行查询的方法。
- Powershell_Script.ps1
> Individual queries
- Query 1.sql
- Query 2.sql
- Query 3.sql
基本上,我希望能够呈现如下菜单,用户只需简单地阅读,并选择一个数字来运行特定的脚本。
Individual Scripts
******************
1. 500MB Files.sql
2. 4GB Files.sql
3. Duplicate Users.sql
4. Flat space Files.sql
etc...
您可以在脚本目录中使用Get-ChildItem,并将其推入ForEachObject循环,以顺序编号每个脚本并在控制台中显示文件名。您可以将脚本的FullName(路径)同时存储在一个变量中,该变量将在用户输入后被引用。
Write-Host "Individual Scripts"
Write-Host "******************`r`n"
$i = 0
$SQL_Scripts = Get-ChildItem -Path "[PATH TO SQL SCRIPTS]" -Filter "*.sql" |
ForEach-Object {
Write-Host "$($i++). $($_.Name)" # Numbers and Write Filename to Console
$_.FullName #Passes back full script path to Array
}
Write-Host ""
$Number = Read-Host -Prompt "Which script do you want to run?"
$Script = $SQL_Scripts[$Number - 1] # User Selected No. - 1 is array element w/ script path
我通过在我的Format-Table属性列表中添加一个表达式字段来实现这一点:
@{Label = "Index"; Expression = { 1 + [array]::indexof($myArray, $_) } }
在使用Read-Host获取一个数字后,我减去1以返回数组中的实际偏移量。