我正在尝试创建一个“switch”语句,该语句将根据返回的对象数量进行大量选择。
第一个例子:
[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
但即使这段代码产生正确的“Switch”语句为字符串,我也无法执行它。为什么?
无论如何,这种方法真的很难看,所以也许有更好的方法?
答案 0 :(得分:2)
该switch语句由脚本块组成。你不能只为它们替换字符串。
你可以使用[scriptblock] :: create()从字符串创建新的脚本块,但在这个应用程序中,我想我只是编写一个脚本块的有序哈希表。然后你可以在manu中显示要映射到需要运行的脚本块的键,以及一个数组索引以匹配你需要提供的选项数。
答案 1 :(得分:2)
虽然有可能在问题域的完整上下文@Shay的解决方案可能是必要的,但所述示例只是要求进行数组查找,因此可以实现相同的结果:
[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的解决方案中一样,如果您输入超出范围的值,则不会获得返回值。
答案 2 :(得分:1)
尝试一下,在提示时输入1-4之间的数字:
[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