来自PowerShell数组的用户选择菜单,包含9个以上的项目

时间:2016-09-28 19:25:51

标签: arrays powershell menu

我有一个PowerShell函数,用于动态生成交互式菜单。我将值传递给数组名称$ mlist,然后根据数组的内容生成菜单。用户只需选择与其所需选择相关联的数字。当数组包含9个或更少的项目时,代码工作正常。如果数组包含9个以上的项目,我可以选择的唯一选择是" 1"。选择任何其他选择会导致再次显示菜单。我将它封装在while语句中,这是没有选择项目时所需的功能。所以基本上它忽略了除了" 1"之外的任何条目。当数组包含超过9个项目时。这是代码:

$global:ans = $null
$global:selection = $null
While ($ans -lt 1 -or $ans -gt $mlist.count){
    $mhead
    Write-Host # empty line
    $menu = @{}
    for ($i=1;$i -le $mlist.count;$i++) {
        if ($mlist.count -gt 1){
            Write-Host -fore Cyan "  $i." $($mlist[$i-1]) 
            $menu.Add($i,($mlist[$i-1]))
        }else{
            Write-Host -fore Cyan "  $i." $mlist
            $menu.Add($i,$mlist)
        }
    }
    Write-Host # empty line
    $global:ans = Read-Host 'Please enter selection'
}
$global:selection = $menu.Item([int]$ans)

1 个答案:

答案 0 :(得分:1)

Read-Host读取一个字符串,这一行:

While ($ans -lt 1 -or $ans -gt $mlist.count){

将其与数字进行比较。在那种比较中,PowerShell将右侧的东西转换为左侧的东西。 $ans"5"$mlist.count变为"12",字符串排序按顺序排列"12","5",因此会触发$ans -gt $mlist.count并再次循环。

修复:将其强制转换为整数。

$global:ans = Read-Host 'Please enter selection'
$global:ans = $global:ans -as [int]

出于这个原因,在测试相等/大于/小于和小于右边的变量时,左边有固定的东西是个好习惯。

如果我对整个事情发表评论,我可能会将其重写为:

$mlist = ('a')#,'b','c','d','e','f','g','h','i','j','k')

# Force $mlist to always be an array, even if only 1 thing in it, to remove if/then test.
$mlist = @($mlist)


$global:selection = $null

Do
{
    $mhead
    Write-Host # empty line

    for ($i=0; $i -lt $mlist.count; $i++)
    {
        Write-Host -ForegroundColor Cyan "  $($i+1)." $mlist[$i]
    }
    Write-Host # empty line
    $global:ans = (Read-Host 'Please enter selection') -as [int]

} While ((-not $ans) -or (0 -gt $ans) -or ($mlist.Count -lt $ans))

$global:selection = $mlist[$ans - 1]
$global:selection

这摆脱了if / then,它摆脱了$menu字典,它通过使用do / while来摆脱初始化$ ans。