PDA

Показать полную графическую версию : Вопрос по PowerShell


lcnet
06-04-2022, 10:47
Приветствую!
Сделал простенький скрипт, который спрашивает и устанавливает значение переменной в зависимости от выбора и должен завершить цикл, если выбор сделан правильно или продолжить цикл, если выбор сделан неправильно.
Но цикл не хочет работать с условием, по этому внутри цикла ставлю "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
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

Sham
06-04-2022, 16:41
с объектами проще
$servers = @{
'1' = 'S170009';
'2' = 'S170013'
}
do {
$answer = ...
...
} while (-not $servers[$answer])
$servers[$answer]
while($answer -ne '1' -or $answer -ne '2') »
не 1 ИЛИ не 2 - это вечный цикл. По логике там -and.

lcnet
07-04-2022, 16:37
Если будет -and, то условие будет выполняться, только при соблюдении обоих условий...
А у меня или или

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 »

Этот вариант работает как надо.
Спасибо!

Sham
07-04-2022, 20:09
Если будет -and, то условие будет выполняться, только при соблюдении обоих условий... »
по логике у вас вечный цикл, пока из консоли не придёт 1 или 2, т.е. while (-not ($answer -eq '1' -or $answer -eq '2')) что аналогично while ($answer -ne '1' -and $answer -ne '2')
while ($answer -lt 1 -or $answer -gt 2) »
это неправильно, потому что из консоли приходит тип строка, и при сравнении число литерал справа приводится к строке. Тут уже действуют правила сравнения строк с операторами больше/меньше. Введите в консоль 111 к примеру.

DJ Mogarych
07-04-2022, 21:37
Sham, так лучше?

until ($answer -in 1..2)

Sham
08-04-2022, 00:58
вроде без разницы until(...) или while(-not (...)) / -notin

lcnet
11-04-2022, 10:12
Цитата 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, то же подходит.

спасибо




© OSzone.net 2001-2012