Вопрос по PowerShell
Приветствую!
Сделал простенький скрипт, который спрашивает и устанавливает значение переменной в зависимости от выбора и должен завершить цикл, если выбор сделан правильно или продолжить цикл, если выбор сделан неправильно.
Но цикл не хочет работать с условием, по этому внутри цикла ставлю "Break".
Хотелось бы обойтись без костылей.
Подскажите плиз, что не так?
Код:
$answer = $(Write-Host "Выбираем сервер: 1 - S170009, 2 - S170013" -ForegroundColor White -BackgroundColor Black) + $(Read-Host)
while($answer -ne '1' -or $answer -ne '2'){
if ($answer -eq '1'){
$srv = 'S170009'
#Break
}
elseif ($answer -eq '2'){
$srv = 'S170013'
#Break
}
else
{
Write-Host "Неправильный выбор. Пробуем еще раз" -ForegroundColor White -BackgroundColor Red
}
$answer = $(Write-Host "Выбираем сервер: 1 - S170009, 2 - S170013" -ForegroundColor White -BackgroundColor Black) + $(Read-Host)
}
Write-Host $srv
|
DJ Mogarych |
06-04-2022 13:17 2982821 |
Код:
do {
"Выберите сервер:
1 - S170009
2 - S170013"
$answer = Read-Host "Введите номер сервера"
switch ($answer) {
1 {$srv = "S170009"}
2 {$srv = "S170013"}
}
} while ($answer -lt 1 -or $answer -gt 2)
$srv
|
с объектами проще
Код:
$servers = @{
'1' = 'S170009';
'2' = 'S170013'
}
do {
$answer = ...
...
} while (-not $servers[$answer])
$servers[$answer]
Цитата:
Цитата lcnet
while($answer -ne '1' -or $answer -ne '2') »
|
не 1 ИЛИ не 2 - это вечный цикл. По логике там -and.
|
Если будет -and, то условие будет выполняться, только при соблюдении обоих условий...
А у меня или или
Цитата:
Цитата DJ Mogarych
do {
"Выберите сервер:
1 - S170009
2 - S170013"
$answer = Read-Host "Введите номер сервера"
switch ($answer) {
1 {$srv = "S170009"}
2 {$srv = "S170013"}
}
} while ($answer -lt 1 -or $answer -gt 2)
$srv »
|
Этот вариант работает как надо.
Спасибо!
|
Цитата:
Цитата lcnet
Если будет -and, то условие будет выполняться, только при соблюдении обоих условий... »
|
по логике у вас вечный цикл, пока из консоли не придёт 1 или 2, т.е. while (-not ($answer -eq '1' -or $answer -eq '2')) что аналогично while ($answer -ne '1' -and $answer -ne '2')
Цитата:
Цитата lcnet
while ($answer -lt 1 -or $answer -gt 2) »
|
это неправильно, потому что из консоли приходит тип строка, и при сравнении число литерал справа приводится к строке. Тут уже действуют правила сравнения строк с операторами больше/меньше. Введите в консоль 111 к примеру.
|
DJ Mogarych |
07-04-2022 21:37 2982882 |
Sham, так лучше?
Код:
until ($answer -in 1..2)
|
вроде без разницы until(...) или while(-not (...)) / -notin
|
Цитата Sham:
Цитата:
по логике у вас вечный цикл, пока из консоли не придёт 1 или 2, т.е. while (-not ($answer -eq '1' -or $answer -eq '2')) что аналогично while ($answer -ne '1' -and $answer -ne '2')
|
Ну так, это и надо. чтобы при неправильном выборе снова предлагался выбор.
да, был неправ, $answer -ne 1 -and $answer -ne 2, то же подходит.
спасибо
|
Время: 23:48.
© OSzone.net 2001-