2016-09-28 4 views
0

私は、オンザフライで対話型メニューを生成するために使用するPowerShell関数を持っています。値を配列名$ mlistに渡し、配列の内容に基づいてメニューを生成します。ユーザは、単にそれらの所望の選択に関連する番号を選択するだけである。配列に9個以下の項目が含まれていると、コードは正常に動作します。配列に9つ以上の項目が含まれている場合、選択できる選択肢は「1」だけです。他の選択を選択すると、メニューが再び表示されます。 whileステートメントでカプセル化されていますが、これはアイテムが選択されていないときに望ましい機能です。したがって、配列に9以上の項目が含まれている場合、基本的に "1"以外の項目は無視されます。ここでは、コードは次のとおりです。9個以上のアイテムを持つPowerShellアレイのユーザー選択メニュー

$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] 

それはこのような理由のために、右側のより小さいより大きい平等/ /、および変数をテストするとき、左のものを固定していることをお勧めです。

私は、全体のことについてコメントしているかのように、私はそれを書き換えることがあります。これは、/そして、それは$menu辞書を取り除く場合、それは$アンスを初期化を取り除くを取り除く

$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 

最初にdo/whileを使用します。

+0

完全に動作します。 $ mlistには1つの項目だけが含まれていたので問題が発生していました。ありがとうございました! –

関連する問題