Arrays Powershell开关-根据数组元素的数量设置选项的数量

Arrays Powershell开关-根据数组元素的数量设置选项的数量,arrays,powershell,switch-statement,Arrays,Powershell,Switch Statement,我正在尝试创建一个“switch”语句,该语句将根据返回对象的数量提供大量的选择 第一个例子: [array]$A1 = ("QWERTY", "ASDFGH") 因此,“开关”功能将如下所示: Switch ($Login = read-Host -Prompt Login) { 1 { $Login = "QWERTY" } 2 { $Login = "ASDFGH" } Switch ($Login = read-Host -Prompt Login) { 1 { $Login = "

我正在尝试创建一个“switch”语句,该语句将根据返回对象的数量提供大量的选择

第一个例子:

[array]$A1 = ("QWERTY", "ASDFGH")
因此,“开关”功能将如下所示:

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

第二个例子:

[array]$A2 = ("A", "B", "C", "D")
因此,“开关”功能将如下所示:

Switch ($Login = read-Host -Prompt Login) {
1 { $Login = "QWERTY" }
2 { $Login = "ASDFGH" }
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”语句,我也无法执行它。为什么?


无论如何,这个方法真的很难看,所以也许有更好的方法?

switch语句是由脚本块组成的。你不能用字符串来代替它们


您可以使用[scriptblock]::create()从字符串创建新的脚本块,但是在这个应用程序中,我想我只需要建立一个有序的脚本块哈希表。然后,您将在manu中显示映射到需要运行的脚本块的键,以及与需要显示的选项数量相匹配的数组索引。

该switch语句由脚本块组成。你不能用字符串来代替它们


您可以使用[scriptblock]::create()从字符串创建新的脚本块,但是在这个应用程序中,我想我只需要建立一个有序的脚本块哈希表。然后,您将在manu中显示映射到需要运行的脚本块的键,以及与需要显示的选项数匹配的数组索引。

尝试一下,输入一个介于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 

尝试一下,输入一个介于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 

虽然在问题域的完整上下文中@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的解决方案中所述,如果您输入的值超出范围,则不会得到返回值。

虽然可能需要问题域的完整上下文@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的解决方案一样,如果输入的值超出范围,则不会得到返回值。

谢谢!我以前尝试过调用表达式,但我相信我的字符串是错误的。现在一切都好了,谢谢!我以前尝试过调用表达式,但我相信我的字符串是错误的。现在一切正常。谢谢回复。Shay Levy ansfer为我工作,但您能解释/发布“脚本块有序哈希表”的小示例吗?谢谢回复。Shay Levy ansfer为我工作,但你能解释/发布“脚本块的有序哈希表”的小示例吗?你使用
开关
语句有什么原因吗?对我来说,
$Login=$A1[(读取主机-提示登录)-1]
更有意义。非常好
[array]$A1=(“QWERTY”,“ASDFGH”)$A1 |%{$i=$A1.IndexOf($)+1写入主机“$i$”}$Login=$A1[(读取主机-提示登录)-1]$Login
是否有使用
开关
语句的原因?对我来说,
$Login=$A1[(读取主机-提示登录)-1]
更有意义。非常好
[array]$A1=(“QWERTY”,“ASDFGH”)$A1 |%{$i=$A1.IndexOf($)+1写入主机“$i$”}$Login=$A1[(读取主机-提示登录)-1]$Login
非常简单,但也是非常好的方法。非常感谢。非常简单,但也是非常好的方法。非常感谢。