如何允许在编号菜单中进行多项选择?

问题描述 投票:0回答:2

这与我之前关于 FTP 时间戳的问题有关。我正在编写一个脚本,通过简化电脑设置来帮助我以及其他人的工作变得更好。现在一切都很完美,除了我想让它更加自动化。现在它一次只允许做一件事。我希望能够选择多个数字并让它一个接一个地运行它们。

这需要在 Windows 7 中运行,无需导入任何额外的模块。

这是我到目前为止所拥有的:

echo ""
$answer = read-host "Select a number"
echo ""

if ($answer -eq 1){uninstall}
if ($answer -eq 2){flashjava}
if ($answer -eq 3){reader}
if ($answer -eq 4){firefox}
if ($answer -eq 5){chrome}
if ($answer -eq 6){office}
if ($answer -eq 7){reader}
if ($answer -eq 8){updates}
if ($answer -eq 9){exit}

else {write-host -ForegroundColor red "Invalid Selection"
    sleep 2
    mainmenu
    }
echo ""

我不想选择选项 2(例如),而是放手,然后点击选项 3,依此类推,我想输入“2,3”(不带引号)并让它依次点击两个函数。

我研究过 foreach 循环,但无法让它工作。

echo ""
$num = read-host "Select a number"
echo ""

$num.split(",")
ForEach($answer in $num){

if ($answer -eq 1){uninstall}
if ($answer -eq 2){flashjava}
if ($answer -eq 3){reader}
if ($answer -eq 4){firefox}
if ($answer -eq 5){chrome}
if ($answer -eq 6){office}
if ($answer -eq 7){reader}
if ($answer -eq 8){updates}
if ($answer -eq 9){exit}

}

else {write-host -ForegroundColor red "Invalid Selection"
    sleep 2
    mainmenu
    }
echo ""

我知道 Else 语句会捕获除单个 1-9 之外的任何内容。我已经尝试注释掉该部分,但仍然没有任何结果。如果我选择一个数字而不是多个数字,它会起作用。我还尝试将 if 语句中的数字放在引号中。它还会显示我在运行该函数或退出之前选择的数字。我不想显示任何输出。

谢谢!

更新:环顾四周后,我找到了开关参数。看起来效果很好!

   do {
   do {
    cls
    write-host ""
    write-host "****************************"
    write-host "**       Main Menu        **"
    write-host "****************************"
    write-host ""

    write-host "1 - Uninstall Bundled Apps"
    write-host "2 - Install Flash & Java"
    write-host "3 - Install Adobe Reader"
    write-host "4 - Install Firefox"
    write-host "5 - Install Chrome"
    write-host "6 - Install Office 365"
    write-host "7 - Install All"
    write-host ""
    write-host "8 - Check for Installer Updates"
    write-host ""
    write-host "9 - Exit"

    write-host ""
    $answer = read-host "Select number(s)"

    $ok = $answer -match '[123456789]+$'
    if ( -not $ok) {write-host "Invalid selection"
                    sleep 2
                    write-host ""
                    }
    } until ($ok)

    switch -Regex ( $answer ) {
    "1" {uninstall}
    "2" {flashjava}
    "3" {reader}
    "4" {firefox}
    "5" {chrome}
    "6" {o365}
    "7" {uninstall}
    "8" {updates}
    }

    } until ( $answer -match "9" )

    }
powershell menu automation
2个回答
1
投票

其实你们真的很亲密。主要问题是

$num.Split()
返回数组,但不修改
$num
,因此当您在
$num
循环中使用
foreach()
时,您正在使用原始值。看看这里的变化:

echo ""
$num = read-host "Select a number"
echo ""

$nums = $num.split(",")
ForEach($answer in $nums){

    if ($answer -eq 1){uninstall}
    if ($answer -eq 2){flashjava}
    if ($answer -eq 3){reader}
    if ($answer -eq 4){firefox}
    if ($answer -eq 5){chrome}
    if ($answer -eq 6){office}
    if ($answer -eq 7){reader}
    if ($answer -eq 8){updates}
    if ($answer -eq 9){exit}


}

# else {write-host -ForegroundColor red "Invalid Selection"
#    sleep 2
#    mainmenu
#    }
# commented out because this else no longer corresponds to anything
echo ""

现在稍微清理一下,让我们用

switch
来看看:

echo ""
$num = read-host "Select a number"
echo ""

$nums = $num.split(",")
ForEach($answer in $nums){

    switch ($answer) {
        1 {uninstall}
        2 {flashjava}
        3 {reader}
        4 {firefox}
        5 {chrome}
        6 {office}
        7 {reader}
        8 {updates}
        9 {exit}
        default {
            write-host -ForegroundColor red "Invalid Selection"
            sleep 2
            mainmenu
        }
    }
}
echo ""

0
投票

这个答案来得太晚了,但对以后的访客有参考价值。

这是一个完整的、高级的、多用途的 Cmd-Let 菜单生成器(托管在 PowerShell Gallery 中):

PS菜单

© www.soinside.com 2019 - 2024. All rights reserved.