|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - разобраться в выводе условного оператора |
|
|
PowerShell - разобраться в выводе условного оператора
|
Новый участник Сообщения: 33 |
Приветствую!
Хочу, чтобы цикл завершился, если обе (количество не важно, если все) службы остановлены Может кто подсказать, почему такая конструкция не работает? $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 |
Ветеран Сообщения: 992
|
Профиль | Сайт | Отправить 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 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 136
|
Профиль | Сайт | Отправить 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 и не будет. |
------- Отправлено: 13:52, 01-07-2021 | #3 |
Новый участник Сообщения: 33
|
Профиль | Отправить PM | Цитировать Pavel Nagaev, Спасибо! Я хотел поставить условие в цикл, но что-то меня смутил и я решил сделать условие внутри.
Elven, Спасибо! я Решил, что раз я вызываю свойство объекта, его можно сравнить со строкой, видно ошибался... Это моя "фантазия" для одного ПК, в определенный момент времени (незапланированный), по этому и не через ГПО. Службы по факту другие и действия тоже. |
Отправлено: 14:25, 01-07-2021 | #4 |
Забанен Сообщения: 793
|
Цитата lcnet:
По-хорошему, опрос пары-тройки сервисов в цикле - ересь. Прочитайте внимательно man Get-Service, раздел параметры. |
||
Отправлено: 18:08, 01-07-2021 | #5 |
Deadooshka Сообщения: 2521
|
Профиль | Отправить PM | Цитировать Строку с массивом сравнивать можно. Предлагают через -not -ne, типа
или можно через Array.TrueForAll с делегатом
|
Отправлено: 19:58, 01-07-2021 | #6 |
Забанен Сообщения: 793
|
Цитата Sham:
|
|
Отправлено: 21:51, 01-07-2021 | #7 |
Deadooshka Сообщения: 2521
|
Профиль | Отправить PM | Цитировать Цитата greg zakharov:
2. там требуется булев, а не массив булей. Непустой массив всегда кастуется к true. |
|
Отправлено: 00:30, 02-07-2021 | #8 |
Забанен Сообщения: 793
|
Sham, 1. И что? 2. Метод TrueForAll, если вы не в курсе, также выводит логический тип для всех значений, итогом чего становится результат их объединения согласно правилам булевой математики.
|
Отправлено: 07:41, 02-07-2021 | #9 |
Deadooshka Сообщения: 2521
|
Профиль | Отправить PM | Цитировать greg zakharov, если мы имеем коэрсию array->bool в if(), то она не по булевым правилам. [bool]@($false, $false) это $true
|
Отправлено: 22:29, 02-07-2021 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|