Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 29.12.2020
Сообщений: 21
1

Цикл cmd

29.12.2020, 17:34. Показов 2096. Ответов 5

Author24 — интернет-сервис помощи студентам
Сдаюсь.
Я сделал, но оно неправильно.
Если кто подскажет мыслью, буду рад, признателен, плюс в карму и будь здоров многие годы.
Суть: есть первая служба, назовём её 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"
То есть он запрашивает статус 1 службы, если она "stopped", то останавливает вторую, если нет, то делает паузу и повторяет процесс. Нужно это оформить как-то циклом

Добавлено через 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%
А вот тут по неведомым причинам переменная a принимает 0, цикл разрушается и идет к следующему.
Код
for %%a in (0) do (
	sc query "service1" | find /i "stopped"
	set a=%errorlevel%
)

Проверил еще раз, принимает тоже значение 1, цикл отрабатывается 2 раз и останавливается, как сделать, чтобы он продолжал работать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2020, 17:34
Ответы с готовыми решениями:

Цикл переименования файлов - CMD/BAT
Помите пожалуйста, есть 66 файлов, как пронумировать "по 11"? Т.е. Есть:...

Как написать cmd создающий другой cmd
Добрый день. Смысл в том, чтобы создать CMD с настройками текущего ПК: имя компьютера и имя...

Запуск cmd файла с определенного места в его коде из другого cmd файла
Здравствуйте. Требуется команда для запуска батника с метки внутри него, а не с первой команды в...

Batch (CMD/BAT) несколько заданий на CMD/BAT
1.Напишите bat файл на диске с ,который будет искать на всех дисках файлы с расширением...

5
5985 / 1994 / 323
Регистрация: 10.12.2013
Сообщений: 6,875
29.12.2020, 17:52 2
Лучший ответ Сообщение было отмечено Nevilsky как решение

Решение

PowerShell
1
2
3
4
5
foreach( $service in  get-service "service1", "service2", "service3" ) {
    
    stop-service $service
    $service.waitforstatus("stopped")
}
Добавлено через 6 минут
если имена сервисов похожи и подпадают под однозначный критерий, то можно и так:
PowerShell
1
foreach( $service in  get-service "*network*" ) {
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
Цитата Сообщение от Nevilsky Посмотреть сообщение
будь здоров на многие годы.
я правильно понял, что должна остаться некоторая дельта, в течение которой мне здоровья не желают ?

( в сравнении с пожеланием 'будь здоров всегда' )
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 - это ждать соответственно остановки или старта сервиса, то есть, вся задача уместится в одну короткую строку:

PowerShell
1
stop-service (get-service "*network*)
или даже так, используя псевдонимы команд:

PowerShell
1
spsv (gsv "*network*")

а вариант
PowerShell
1
2
3
4
5
foreach( $service in  get-service "service1", "service2", "service3" ) {
    
    stop-service $service
    $service.waitforstatus("stopped")
}
будет полезен, если в метод waitforstatus добавить опциональный таймаут, например, 5 секунд.
( если в течение 5 сек сервис не останавливается, больше не ждут и переходят к следующему)

PowerShell
1
2
3
4
5
foreach( $service in  get-service "service1", "service2", "service3" ) {
    
    stop-service $service
    $service.waitforstatus("stopped", "00:00:05")
}
0
29.12.2020, 18:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.12.2020, 18:52
Помогаю со студенческими работами здесь

Отличие CMD в Windows 7 от CMD в Windows XP
Вообщем из за чего данная моя помощь отрабатывает в XP, но не работает в вин 7 ?...

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать...

Восстановление значений cmd [cmd, ooov.net]
Здравствуйте, Столкнулся с такой проблемой, при запуске Windows открывался cmd и осуществлялся...

Вычислить и вывести сумму чётных целых чисел в интервале от 1 до n: 1) цикл «ДО» 2) цикл «ПОКА» 3) цикл «ДЛЯ»
Вычислить и вывести сумму чётных целых чисел в интервале от 1 до n: 1. цикл «ДО» 2. цикл «ПОКА»...

Написать цикл for, который выводит на экран в столбец числа от 0.3 до 2.7 с шагом 0.2. Переписать этот цикл в цикл while
Пожалуйста помогите с задачами 1.Написать цикл for, который выводит на экран в столбец числа от...

необходимо на паскале написать три программы ( цикл с параметром, цикл с постусловием и цикл с предусловием)
Помогите пожалуйста!!! необходимо на паскале написать три программы ( цикл с параметром, цикл с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru