2013-04-24 47 views
0

我試圖創建一個「開關」語句,將有大量的選擇基於返回的對象的數量。Powershell開關 - 設置基於數組元素數量的選擇量

第一示例:

[array]$A1 = ("QWERTY", "ASDFGH") 

因此 「開關」 功能將看起來像這樣:

Switch ($Login = read-Host -Prompt Login) { 
1 { $Login = "QWERTY" } 
2 { $Login = "ASDFGH" } 

}

第二示例:

[array]$A2 = ("A", "B", "C", "D") 

所以「開關「功能確定這樣的:

Switch ($Login = read-Host -Prompt Login) { 
1 { $Login = "A" } 
2 { $Login = "B" } 
3 { $Login = "C" } 
4 { $Login = "D" } 
} 

,所以我想一些foreach循環來創建簡單的字符串,然後從字符串命令運行。我奶源要做到這一點,但我無法運行我的生成的字符串命令:

[array]$AR1 = ("QWERTY", "ASDFGH") 

$q1 = "switch (Read-Host -Prompt Login) {" 
$q2 = " }" 
$Number = 0 
$Script:ArrayFull = $null 

$AR1 | % { 

    $_ 

$ArrayElement = $null 

$NameOfTheLoginVariable = '$Script:User_Login' 
$NumberOfArrayElements = $AR1.count 
    if ($NumberOfArrayElements -ne 0) { 
    $Number = $Number+1 
    $NumberOfArrayElements = $NumberOfArrayElements-1 

    $ArrayElement = "$Number { $NameOfTheLoginVariable = '$_' }" 
    $ArrayElement 
    $Script:ArrayFull += $ArrayElement 

    } 
} 

$SwitchCommand = $q1+$ArrayFull+$q2 
$SwitchCommand = $SwitchCommand.ToString() 

$Test1 = "switch (Read-Host) {1 { $Script:User_Login = 'QWERTY' }1 { $Script:User_Login = 'ASDFGH' } }" 
#switch (Read-Host -Prompt Login) {1 { $Script:User_Login = 'QWERTY' }1 { $Script:User_Login = 'ASDFGH' } } 


#& $Test1 
& $SwitchCommand 

但是,即使這個代碼產生正確的「開關」語句作爲字符串,我不能執行它。爲什麼?

無論如何,這種方法真的很醜,所以也許有更好的方法嗎?

+1

你有使用'switch'語句的原因嗎?對我而言,'$ Login = $ A1 [(Read-Host -Prompt Login) - 1]'更有意義。 – SpellingD 2013-04-25 16:20:00

+0

非常好! '[array] $ A1 =(「QWERTY」,「ASDFGH」) $ A1 | %{ $ i = $ A1.IndexOf($ _)+1 Write-Host「$ i $ _」 } $ Login = $ A1 [(Read-Host -Prompt Login) - 1] $ Login' – ALIENQuake 2013-06-17 18:32:54

回答

1

試試這個,1-4之間entera號whyen提示:

[array]$a = "A", "B", "C", "D" 

$login = read-host login 

$switch = 'switch($login){' 

for($i=1;$i -le $a.length; $i++) 
{ 
    $switch += "`n`t$i { '$($a[$i-1])'; break }" 
} 

$switch += "`n}" 

Invoke-Expression $switch 
+0

謝謝!我之前嘗試做一些Invoke-Expression的東西,但我相信我的字符串是錯誤的。現在一切正常。 – ALIENQuake 2013-04-24 18:50:10

2

該switch語句由腳本塊組成。你不能只爲他們替換一個字符串。

你可以使用[scriptblock] :: create()從字符串中創建新的腳本塊,但在這個應用程序中,我想我只是處理一個有序的腳本塊散列表。然後,您將在映射到需要運行的腳本塊的manu中顯示鍵,並使數組索引與需要顯示的選項數相匹配。

+0

Thx回覆。謝利維ansfer爲我工作,但你能解釋/發佈「腳本塊有序散列表」的小例子嗎? – ALIENQuake 2013-04-24 18:51:24

1

雖然它有可能與問題域@吉文的解決方案可能是必要的完整的上下文,所陳述的例子只是要求一個數組查找因此同樣的結果可能與實現這一目標:

[array]$a = "A", "B", "C", "D" 
[int]$login = read-host -prompt login 
$selected = & {if ($login -ge 0 -and $login -lt $a.Length) { $a[$login-1] }} 

所以在這裏再次,如果你輸入2,你會得到「B」。就像在陳述的例子和Shay的解決方案中一樣,如果你輸入一個超出範圍的值,你就不會得到返回的值。

+0

非常簡單但也非常好的做法。謝謝! – ALIENQuake 2013-04-26 08:04:23