Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Вопрос по PowerShell (http://forum.oszone.net/showthread.php?t=351001)

lcnet 06-04-2022 10:47 2982816

Вопрос по 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


Sham 06-04-2022 16:41 2982826

с объектами проще
Код:

$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.

lcnet 07-04-2022 16:37 2982863

Если будет -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 »

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

Sham 07-04-2022 20:09 2982876

Цитата:

Цитата 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)

Sham 08-04-2022 00:58 2982888

вроде без разницы until(...) или while(-not (...)) / -notin

lcnet 11-04-2022 10:12 2983065

Цитата 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.

Время: 23:48.
© OSzone.net 2001-