Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - разобраться в выводе условного оператора

Ответить
Настройки темы
PowerShell - разобраться в выводе условного оператора

Новый участник


Сообщения: 33
Благодарности: 0

Профиль | Отправить PM | Цитировать


Приветствую!
Хочу, чтобы цикл завершился, если обе (количество не важно, если все) службы остановлены
Может кто подсказать, почему такая конструкция не работает?

Код: Выделить весь код
$status = 'Stopped'
[array]$srv = 'dwmrcs', 'FoxitReaderUpdateService'
 
Stop-Service -Name $srv
 
while ($true){
    if ($status -eq (Get-Service -Name $srv).Status){
        Write-Host 'Служба остановлена'
        sleep 5
        break
    }
}
Обе службы остановлены...

Тут, наверное, надо понять, почему ($status -eq (Get-Service -Name $srv).Status) выдает False.
Я не совсем понимаю...

Отправлено: 13:01, 01-07-2021

 

Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


емнип break будет выводить из текущей итерации, на цикл он никак не влияет. а т.к. это while ($true), то цикл и продолжит выполняться.
($status -eq (Get-Service -Name $srv).Status) выдает False потому, что сравнивается строка с массивом. можно попробовать опрашивать каждый из элементов массива, только не руками, конечно проверки добавлять, а в цикле. их в пошике есть и кроме while. я бы использовал в данном случае пайп на foreach, ну или (вдруг) for с нуля до < $srv.length.
можно, конечно, и while, и do until - как фантазия подскажет, но всё же условия выхода из цикла должно быть оговорено в самом цикле, а различные искусственные выбивания из оного - есть неправильно и весьма нехорошо. Скрипты и так очень часто по сути своей костыли, не нужно костыли подпирать дополнительными костылями.
и еще один пункт, остановку сервиса лучше тоже запихать в цикл, а то он будет бесконечно пытаться проверить остановился ли сервис, который попытался остановиться один раз, у него не получилось и всё (да и то я не уверен, что в stop-Service можно скармливать массив, команда-то пройдет, а всем ли сервисам будет отдан приказ на остановку - вилами по воде).

и последнее, но не по значению. Почему службы останавливаются скриптом, а не групповыми политиками? Это было бы и проще и эффективнее.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:42, 01-07-2021 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Pavel Nagaev

Пользователь


Сообщения: 136
Благодарности: 40

Профиль | Сайт | Отправить PM | Цитировать


$status = 'Stopped'
[array]$srv = 'Spooler', 'MSExchangeHM'

Stop-Service -Name $srv

while (((Get-Service -Name $srv)|Where-Object {$PSItem.Status -ne "Stopped"})){

sleep 5
}

cls
write-host "finish" -ForegroundColor Green

По вашему коду.
1. while ($true) и выход по break, это считается плохой практикой, т.к. цикл может продолжаться вечно, если есть условие выхода из цикла, то надо его в условия и ставить.
2. ($status -eq (Get-Service -Name $srv).Status) вы[b] сравниваете строку с массивом, обычно в левой части условия используется вычисляемое значение, а в правой статическое значение, хотя это больше дело привычки. Поэтому True и не будет.

-------
Видео на русском про PowerShell
Крутые курсы по PowerShell

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:52, 01-07-2021 | #3


Новый участник


Сообщения: 33
Благодарности: 0

Профиль | Отправить PM | Цитировать


Pavel Nagaev, Спасибо! Я хотел поставить условие в цикл, но что-то меня смутил и я решил сделать условие внутри.

Elven, Спасибо! я Решил, что раз я вызываю свойство объекта, его можно сравнить со строкой, видно ошибался... Это моя "фантазия" для одного ПК, в определенный момент времени (незапланированный), по этому и не через ГПО.
Службы по факту другие и действия тоже.

Отправлено: 14:25, 01-07-2021 | #4


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Цитата lcnet:
Службы по факту другие и действия тоже.
Да и цикл, видимо, был женский...

По-хорошему, опрос пары-тройки сервисов в цикле - ересь. Прочитайте внимательно man Get-Service, раздел параметры.

Отправлено: 18:08, 01-07-2021 | #5


Deadooshka


Сообщения: 2521
Благодарности: 693

Профиль | Отправить PM | Цитировать


Строку с массивом сравнивать можно. Предлагают через -not -ne, типа
Код: Выделить весь код
if (-not ((Get-Service -Name $srv).Status -ne $status))
или можно через Array.TrueForAll с делегатом
Код: Выделить весь код
[array]::TrueForAll([String[]](Get-Service -Name $srv).Status, [Predicate[String]]{param($str) $str -eq $status})

Отправлено: 19:58, 01-07-2021 | #6


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Цитата Sham:
Строку с массивом сравнивать можно. Предлагают через -not -ne, типа
Код: Выделить весь код
if (-not ((Get-Service -Name $srv).Status -ne $status))
или можно через Array.TrueForAll с делегатом
Код: Выделить весь код
[array]::TrueForAll([String[]](Get-Service -Name $srv).Status, [Predicate[String]]{param($str) $str -eq $status})
Для чего оверинжениринг?
Код: Выделить весь код
(Get-Service service1, service2).Status.ForEach{$_ -eq 'stopped'}

Отправлено: 21:51, 01-07-2021 | #7


Deadooshka


Сообщения: 2521
Благодарности: 693

Профиль | Отправить PM | Цитировать


Цитата greg zakharov:
.ForEach{$_ -eq 'stopped'} »
1. PS 4.0+
2. там требуется булев, а не массив булей. Непустой массив всегда кастуется к true.

Отправлено: 00:30, 02-07-2021 | #8


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Sham, 1. И что? 2. Метод TrueForAll, если вы не в курсе, также выводит логический тип для всех значений, итогом чего становится результат их объединения согласно правилам булевой математики.

Отправлено: 07:41, 02-07-2021 | #9


Deadooshka


Сообщения: 2521
Благодарности: 693

Профиль | Отправить PM | Цитировать


greg zakharov, если мы имеем коэрсию array->bool в if(), то она не по булевым правилам. [bool]@($false, $false) это $true

Отправлено: 22:29, 02-07-2021 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - разобраться в выводе условного оператора

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2013 - excel Выделить ячейки условного форматирования Alexander_88 Microsoft Office (Word, Excel, Outlook и т.д.) 2 04-10-2015 13:26
Разное - Непростое правило условного форматирования Funky_Rusher Microsoft Office (Word, Excel, Outlook и т.д.) 1 30-08-2012 14:35
Какого оператора для мобильного интернета выбрать? помогите разобраться... loTokGol Хочу все знать 5 11-07-2011 16:43
2010 - Инфокривые и новые возможности условного форматирования в Excel 2010 OSZone Microsoft Office (Word, Excel, Outlook и т.д.) 0 24-03-2010 10:30
Интернет - Куча тунелей в выводе ipconfig /all Envel Microsoft Windows Vista 0 24-04-2008 17:21




 
Переход