0 / 0 / 0
Регистрация: 29.12.2020
Сообщений: 21
|
|
1 | |
Цикл cmd29.12.2020, 17:34. Показов 2096. Ответов 5
Сдаюсь.
Я сделал, но оно неправильно. Если кто подскажет мыслью, буду рад, признателен, плюс в карму и будь здоров многие годы. Суть: есть первая служба, назовём её service1. Она-работает, т.е. находится в статусе "running". Есть вторая служба, назовём её service2. Она-тоже работает, тоже находится в статусе "running". Есть третья служба service3 и тд.. Пытаюсь написать батник с циклом, который бы 1)остановил службу service1 2)проверил статус службы service1 3) если в нем есть слово stopped-останавливает службу service2,если в нем нет слова stopped-не останаливает службу service2 и пытается остановить service1. 4)проверяет статус службы service2 5)если в нем есть слово stopped-останавливает службу service3,если в нем нет слова stopped-не останаливает службу service3 и пытается остановить service2. и т.д. Прикол в том, что когда запрашиваешь статус службы, он имеет несколько вариаций. "RUNNING" и "STOPPED"-лишь одни из них. Точно знаю, что есть еще статусы "STOP_PENDING" и "START_PENDING". Необходимо, чтобы службы останавливались поочередно только основываясь на том, что предыдущая имеет статус "stopped", в противном случае-цикл на остановку службы, которая этот статус не имеет. Мозги уже совсем тупят, простите Добавлено через 11 минут Есть у меня код такого вида Код
sc query "service1" | find /i "stopped" set a=%errorlevel% if %a%==0 sc stop "service2" if not %a%==0 timeout /t 5 sc query "service1" | find /i "stopped" set b=%errorlevel% if %b%==0 sc stop "service2" if not %b%==0 timeout /t 10 sc query "service1" | find /i "stopped" set c=%errorlevel% if %c%==0 sc stop "service2" if not %c%==0 timeout /t 60 sc query "service1" | find /i "stopped" set d=%errorlevel% if %d%==0 sc stop "service2" Добавлено через 4 минуты Есть идея оформить цикл так Код
for %%a in (0) do ( sc stop "service1" sc query "service1" | find /i "stopped" set a=%errorlevel% ) for %%b in (0) do ( sc stop "service2" sc query "service2" | find /i "stopped" set b=%errorlevel% ) for %%c in (0) do ( sc stop "service3" sc query "service3" | find /i "stopped" set c=%errorlevel% ) Добавлено через 21 минуту В последнем варианте, с циклом, вариант нерабочий. Запустил: 1)самую последнюю службу не остановил 2)в окне служб сделал refresh сразу после отработки батника и 2-3 службы еще в статусе "stopping", хотя по логике вещей должны быть уже "stopped", ведь цикл переходит к другому циклу только если служба уже "stopped" Добавлено через 13 минут Это считается за флуд или нет? Не хотелось бы, чтобы меня забанили... Начал проверять в чем косяк, выяснилось вот что (при условии, что service1-работает на момент проверки): Тут переменная a принимает значение 1, потому что служба в данный момент "running" и, соответственно, слово "stopped" он не находит Код
sc query "service1" | find /i "stopped" set a=%errorlevel% Код
for %%a in (0) do ( sc query "service1" | find /i "stopped" set a=%errorlevel% ) Проверил еще раз, принимает тоже значение 1, цикл отрабатывается 2 раз и останавливается, как сделать, чтобы он продолжал работать?
0
|
29.12.2020, 17:34 | |
Ответы с готовыми решениями:
5
Цикл переименования файлов - CMD/BAT Как написать cmd создающий другой cmd Запуск cmd файла с определенного места в его коде из другого cmd файла Batch (CMD/BAT) несколько заданий на CMD/BAT |
5985 / 1994 / 323
Регистрация: 10.12.2013
Сообщений: 6,875
|
|||||||||||
29.12.2020, 17:52 | 2 | ||||||||||
Сообщение было отмечено Nevilsky как решение
Решение
если имена сервисов похожи и подпадают под однозначный критерий, то можно и так:
1
|
0 / 0 / 0
Регистрация: 29.12.2020
Сообщений: 21
|
|
29.12.2020, 18:06 [ТС] | 3 |
Благодарю, товарищ, как я уже сказал, безумно рад,признателен, плюс тебе в карму и вообще будь здоров на многие годы.
А это сильно отличается от варианта по трудозатратам цп?Служб...до-фи-га. Код
:stopa sc stop "service1" sc query "service1" | find /i "stopped" set a=%errorlevel% if not %a%==0 goto stopa :stopb sc stop "service2" sc query "service2" | find /i "stopped" set b=%errorlevel% if not %b%==0 goto stopb :stopc sc stop "service3" sc query "service3" | find /i "stopped" set c=%errorlevel% if not %c%==0 goto stopc
0
|
5985 / 1994 / 323
Регистрация: 10.12.2013
Сообщений: 6,875
|
|
29.12.2020, 18:21 | 4 |
я правильно понял, что должна остаться некоторая дельта, в течение которой мне здоровья не желают ?
( в сравнении с пожеланием 'будь здоров всегда' )
1
|
0 / 0 / 0
Регистрация: 29.12.2020
Сообщений: 21
|
|
29.12.2020, 18:30 [ТС] | 5 |
Какой у меня код, так я и выражаюсь-криво.
Товарищ, безумно рад тебе, признателен тебе, безмерных размеров плюсище тебе в карму и вообще будь здоров всегда!
0
|
5985 / 1994 / 323
Регистрация: 10.12.2013
Сообщений: 6,875
|
|||||||||||||||||||||
29.12.2020, 18:52 | 6 | ||||||||||||||||||||
Строго говоря, поведение по умолчанию у powershell-командлетов Stop-Service и Start-Service - это ждать соответственно остановки или старта сервиса, то есть, вся задача уместится в одну короткую строку:
а вариант
( если в течение 5 сек сервис не останавливается, больше не ждут и переходят к следующему)
0
|
29.12.2020, 18:52 | |
29.12.2020, 18:52 | |
Помогаю со студенческими работами здесь
6
Отличие CMD в Windows 7 от CMD в Windows XP Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием... Восстановление значений cmd [cmd, ooov.net] Вычислить и вывести сумму чётных целых чисел в интервале от 1 до n: 1) цикл «ДО» 2) цикл «ПОКА» 3) цикл «ДЛЯ» Написать цикл for, который выводит на экран в столбец числа от 0.3 до 2.7 с шагом 0.2. Переписать этот цикл в цикл while необходимо на паскале написать три программы ( цикл с параметром, цикл с постусловием и цикл с предусловием) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |