2016-09-28 36 views
0

我有一个PowerShell功能,用于在运行中生成交互式菜单。我将值传递给一个数组名称$ mlist,然后根据数组的内容生成菜单。用户只需选择与他们想要的选择相关的号码。当数组包含9个或更少的项目时,代码工作正常。如果数组包含9个以上的项目,我可以选择的唯一选择是“1”。再次显示菜单中的任何其他选择结果。我把它封装在一个while语句中,当没有选择项目时,这是所需的功能。所以基本上,当数组包含超过9个项目时,它会忽略除“1”之外的任何条目。下面是代码:PowerShell阵列中有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) 
+0

传递给函数的数组中包含的数据是什么?我曾尝试使用动态和静态字符串数组。 –

+0

好的,所以更新...我的数组有12个项目。我可以选择1,10,11和12但不是2-9。我的阵列是通过查询vCenter并选择符合特定条件的主机来构建的。所以我的阵列包含12个ESXi主机的主机名。 –

回答

1

读主机读取一个字符串,该行:

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 

这摆脱了如果/那么,它摆脱了$menu字典,它摆脱初始化$ ANS的首先通过使用do/while。

+0

完美的作品。当$ mlist仅包含单个项目时,我遇到了问题,因此修改此问题以解决该问题也很有帮助。谢谢! –

相关问题