Если оператор никогда не оценивает ложь, когда он должен - PullRequest
0 голосов
/ 01 ноября 2018

Еще одна любительская проблема со сценарием, над которым я работаю. У меня проблема с выходом из сценария и консоли из оператора If.

Я пробовал exit, exit(), $host.exit и [Environment]::Exit(1) в моей Else части. Независимо от того, что вводит пользователь, оператор if продолжается.

Я чувствую, что упускаю что-то очень простое, но не могу понять. Я хочу, чтобы он продолжался, только если пользователь вводит «Y» или «y». Что-нибудь еще, я только хочу, чтобы это потерпело неудачу и закрылось ...

Я также позвонил $confirm после ввода пользователем, чтобы убедиться, что он вводит правильную букву, которая является.

Вот часть скрипта, которая не работает:

$confirm = Read-Host "Continue deletion? [Y/N]"

if ($confirm -eq "Y" -or "y") {
    for ($i = 0; $i -le 4; $i++) {
        Get-ChildItem -Path $path0, $path1 -Filter "$dval*"| 
        % { Write-Host 'Deleting' $_.FullName $dval; Remove-Item $_.FullName -Recurse }
        $dval++ } 

} else { [Environment]::Exit(1) }

1 Ответ

0 голосов
/ 01 ноября 2018

Следующее утверждение не делает то, что вы думаете, делает.

if ($confirm -eq "Y" -or "y")

Проблема здесь в том, что здесь проверяются два отдельных утверждения, которые вы можете не ожидать $confirm -eq "Y" и "y". Последний оценил бы его собственный как истинный, так как это непустая непустая строка.

Рассмотрим это одинокое утверждение [bool]"y", которое вернет True.

То, что вы хотели написать, было $confirm -eq "Y" -or $confirm -eq "y". Однако это избыточно , поскольку -eq по умолчанию не учитывает регистр . Так что $confirm -eq "Y" будет достаточно само по себе.

Дополнительное чтение будет о том, как about_Logical_Operators работает. Здесь есть несколько простых примеров того, как объединить несколько сравнений. Сказать, что левая сторона оценивается независимо от правой, было бы неправильно.

Логические операторы PowerShell оценивают только операторы, необходимые для определения истинности значения оператора. Если левый операнд в операторе, который содержит оператор and, равен FALSE, правый операнд не оценивается. Если левый операнд в операторе, который содержит оператор или, имеет значение ИСТИНА, правый операнд не оценивается.

При вводе кода любая буква или значение не имеют никакого эффекта, поскольку -or "y" всегда имеет значение true. Ввод любого не-y значения с обновленным ответом составит $confirm -eq "y" return False


Если бы была причина оценить несколько различных возможностей, вы бы посмотрели на -contains или -in. Я оставлю это вам, чтобы посмотреть дальше на них (чтобы уменьшить касательные)

$confirm -in "y","m","b"

Где Y = Да, M = Может и B = Бублик

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...