循环问题#2切换命令/ Breakin循环

时间:2018-04-06 08:59:51

标签: powershell loops switch-statement break

嘿伙计们我还在试图弄清楚如何以正确的方式为我的脚本使用循环。

现在唯一的问题是,当开关开始并且我不选择任何选项(1,2或Q)时,它跳转到写入“loop Done”的第二部分。

当Loop完成一次后我遇到了同样的问题,我被问到是否要使用R或Q重复或退出。

有没有办法避免这种情况?如果我不使用1,2,R或Q,可以让我返回菜单的中断或其他命令?

function Show-Menu
{
    ([string]$Title = '? ')
    cls
    Write-Host "================ $Title ================"
    Write-Host "1: Wählen Sie '1' für $F1"
    Write-Host "2: Wählen Sie '2' für $F2"
    Write-Host "Q: Wählen Sie 'Q' zum Beenden."
}

$F1 = "Test1"
$F2 = "Test2"

do
{
    Show-Menu
    $input = Read-Host "Bitte wählen Sie aus."
    switch ($input)
    {
        '1' { 
            $vorname = Read-Host "Bitte Vornamen eingeben:"
            $name = Read-Host "Bitte Namen eingeben:"
            $short = Read-Host "Bitte Kürzel eingeben:"
        }

        '2' {
            $short = Read-Host "Bitte Benutzernamen eingeben:"
            $info = Read-Host -Prompt 'Bitte Beschreibung eingeben.'
        }

        'q' {
            return
        }
    }

    do
    {
        Write-Host "Loop done"
        Clear-Variable -Name vorname,short,name,info
        $response = Read-Host "Drücken Sie R zum Wieder holen, Q zum Beenden" 
        if ($response -eq "Q")
        {
            exit
        }
    } until ($response -eq "R")
} until ($input -eq 'q')

1 个答案:

答案 0 :(得分:1)

您可以在获取switch之前检查变量,如果找不到任何预期值,则可以检查continue

在交换机中使用default块会更优雅地处理这个问题,但发现continue / break适用于最内部的块(如预期的那样),而不是外do块。

function Show-Menu
{
  (
           [string]$Title = '? '
     )
     cls
     Write-Host "================ $Title ================"
     Write-Host "1: Wählen Sie '1' für $F1"
     Write-Host "2: Wählen Sie '2' für $F2"
     Write-Host "Q: Wählen Sie 'Q' zum Beenden."
}

$F1 = "Test1"
$F2 = "Test2"

do
{
    Show-Menu
    $input = Read-Host "Bitte wählen Sie aus."

    if($input -notin @(1,2,"q")){
        Continue
    }

    switch ($input)
    {
        '1' {
                $vorname = Read-Host "Bitte Vornamen eingeben:"
                $name = Read-Host "Bitte Namen eingeben:"
                $short = Read-Host "Bitte Kürzel eingeben:"
            }
        '2' {
                $short = Read-Host "Bitte Benutzernamen eingeben:"
                $info = Read-Host -Prompt 'Bitte Beschreibung eingeben.'
            }
        'q' {
                return
            }
         default {
            # this will be executed if $input does not match another option.
            # continue/break will apply to the switch block, not the do block
         }
    }

    do
    {
        Write-Host "Loop done"
        Clear-Variable -Name vorname,short,name,info
        $response = Read-Host "Drücken Sie R zum Wieder holen, Q zum Beenden" 

        if($response -notin @("r","q")){
            Continue
        }        

        if ($response -eq "Q")
        {
            exit
        }
    }until ($response -eq "R")

}until ($input -eq 'q')