我试图创建一个“switch”语句,它将根据返回的对象数量提供大量的选择。
第一示例:
[array]$A1 = ("QWERTY", "ASDFGH")
字符串
所以“switch”函数看起来像这样:
Switch ($Login = read-Host -Prompt Login) {
1 { $Login = "QWERTY" }
2 { $Login = "ASDFGH" }
型
}
第二个例子:
[array]$A2 = ("A", "B", "C", "D")
型
所以“switch”函数看起来像这样:
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”语句作为字符串,我也不能执行它。为什么?为什么?
不管怎么说,这个方法真的很丑,所以也许有一个更好的方法?
3条答案
按热度按时间evrscar21#
switch语句由脚本块组成。你不能用一个字符串来代替它们。
您可以使用[scriptblock]::create()从字符串中创建新的脚本块,但在此应用程序中,我认为我只需要创建一个脚本块的有序散列表。然后,您可以在manu中显示键,这些键将Map到需要运行的脚本块,并且可以使用数组索引来匹配您需要显示的选项数量。
xuo3flqw2#
虽然可能需要问题域的完整上下文@Shay的解决方案,但所述示例只是要求数组查找,因此可以通过以下方式实现相同的结果:
字符串
如果你输入2,你会得到“B”。就像前面的例子和Shay的解决方案一样,如果你输入了一个越界的值,你不会得到一个返回值。
ozxc1zmp3#
给予一下,在提示时输入1-4之间的数字:
字符串