Проблема с оператором switch в цикле while в PowerShell - PullRequest
0 голосов
/ 19 февраля 2019

По какой-то причине цикл while работает сам по себе, оператор Switch работает сам, когда я их объединяю ... цикл While работает нормально, хотя оператор Switch ... не так уж много.

y илиn - это только те значения, которые принимает цикл while, проблема в том, что когда я даю ему y или n, код не выполняется, сценарий просто завершается.

Версия PowerShell 5.1.

While (($UserInput = Read-Host -Prompt "Are you sure? (y/n)") -notmatch '^n$|^y$') {
    Switch ($UserInput) {
        'y' {
            Try {
                Write-Output "Success."
        }
            Catch {
                Write-Output "Error."
            }
        }
        'n' {
            Write-Output "Cancelled."
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

вот более надежный способ сделать то, что вы хотите.он устанавливает правильные варианты, запрашивает ввод, обнаруживает неверный ввод, предупреждает об этом, отображает сообщения об успехе или неудаче - и все это без извращенной логики.[ ухмылка ]

$Choice = ''
$ValidChoiceList = @(
    'n'
    'y'
    )

while ([string]::IsNullOrEmpty($Choice))
    {
    $Choice = Read-Host 'Are you sure? [n/y] '
    if ($Choice -notin $ValidChoiceList)
        {
        [console]::Beep(1000, 300)
        Write-Warning ('Your choice [ {0} ] is not valid.' -f $Choice)
        Write-Warning '    Please try again & choose "n" or "y".'

        $Choice = ''
        pause
        }
    switch ($Choice)
        {
        'y' {Write-Host 'Success!'; break}
        'n' {Write-Warning '    Failure!'; break}
        }
    }

на экране вывода ...

Are you sure? [n/y] : t
WARNING: Your choice [ t ] is not valid.
WARNING:     Please try again & choose "n" or "y".
Press Enter to continue...: 
Are you sure? [n/y] : y
Success!
0 голосов
/ 19 февраля 2019

Вы используете -notmatch.Следовательно, While цикл приводит к ложному результату, и цикл не выполняется.Поскольку вы хотите выполнять сценарий до тех пор, пока не получите «y» или «n» в качестве входных данных, просто используйте !, который будет выполнять сценарий, пока он не получит «y» или «n» в качестве входных данных.Используйте код ниже:

While (!($UserInput = Read-Host -Prompt "Are you sure? (y/n)") -notmatch '^n$|^y$') {
Switch ($UserInput) {
    'y' {
        Try {
            Write-Output "Success."
    }
        Catch {
            Write-Output "Error."
        }
    }
    'n' {
        Write-Output "Cancelled."
        }
    }
}
...