Остановить и запустить службу с помощью пакетного или cmd-файла?

Как я могу написать сценарий bat или cmd для надежной остановки и запуска службы с проверкой ошибок (или сообщить мне, что это не удалось по какой-либо причине)?

Может быть, несколько оффтоп (поскольку вы просите инструкции bat и cmd), но: PowerShell дает вам много контроля и обратной связи для выполнения подобных действий.

GvS 25.09.2008 19:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
295
1
833 552
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Использование кодов возврата из net start и net stop кажется мне лучшим методом. Попробуйте взглянуть на это: Коды возврата Net Start.

Связанная страница больше не существует. Таким образом, сейчас это скорее комментарий.

Neolisk 08.11.2016 23:41

net start [serviceName]

и

net stop [serviceName]

довольно четко сказать, преуспели они или нет. Например

U:\>net stop alerter
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

При запуске из пакетного файла у вас есть доступ к УРОВНЮ ОШИБКИ кода возврата. 0 означает успех. Все, что выше, указывает на неудачу.

В виде файла летучей мыши error.bat:

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause

Результат выглядит так:

U:\>error.bat
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

There was a problem
Press any key to continue . . .

Коды возврата

 - 0 = Success
 - 1 = Not Supported
 - 2 = Access Denied
 - 3 = Dependent Services Running
 - 4 = Invalid Service Control
 - 5 = Service Cannot Accept Control
 - 6 = Service Not Active
 - 7 = Service Request Timeout
 - 8 = Unknown Failure
 - 9 = Path Not Found
 - 10 = Service Already Running
 - 11 = Service Database Locked
 - 12 = Service Dependency Deleted
 - 13 = Service Dependency Failure
 - 14 = Service Disabled
 - 15 = Service Logon Failure
 - 16 = Service Marked For Deletion
 - 17 = Service No Thread
 - 18 = Status Circular Dependency
 - 19 = Status Duplicate Name
 - 20 = Status Invalid Name
 - 21 = Status Invalid Parameter 
 - 22 = Status Invalid Service Account
 - 23 = Status Service Exists
 - 24 = Service Already Paused

Изменить 20.04.2015

Коды возврата:

The NET command does not return the documented Win32_Service class return codes (Service Not Active,Service Request Timeout, etc) and for many errors will simply return Errorlevel 2.

Смотрите здесь: http://ss64.com/nt/net_service.html

NETне является только для сервисных функций, а SCявляется только для сервисных функций.

Wernight 04.07.2012 20:59

Этот ответ лучше, потому что команда net блокирует и ожидает запуска или остановки службы, прежде чем пакетный сценарий продолжит выполнение.

Steven 17.03.2016 15:05

Поскольку (как сказано в Edit) большую часть времени возвращаемый errorlevel равен 2, см. здесь, как интерпретировать результат ошибки.

OfirD 27.03.2020 14:04

Вы можете использовать команду NET START, а затем проверить переменную среды ERRORLEVEL, например

net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%

Отказ от ответственности: я написал это с головы до ног, но думаю, что это сработает.

Ответ принят как подходящий

Используйте команду SC (управление службами), она дает вам гораздо больше возможностей, чем просто start и stop.

  DESCRIPTION:
          SC is a command line program used for communicating with the
          NT Service Controller and services.
  USAGE:
      sc <server> [command] [service name]  ...

      The option <server> has the form "\ServerName"
      Further help on commands can be obtained by typing: "sc [command]"
      Commands:
        query-----------Queries the status for a service, or
                        enumerates the status for types of services.
        queryex---------Queries the extended status for a service, or
                        enumerates the status for types of services.
        start-----------Starts a service.
        pause-----------Sends a PAUSE control request to a service.
        interrogate-----Sends an INTERROGATE control request to a service.
        continue--------Sends a CONTINUE control request to a service.
        stop------------Sends a STOP request to a service.
        config----------Changes the configuration of a service (persistant).
        description-----Changes the description of a service.
        failure---------Changes the actions taken by a service upon failure.
        qc--------------Queries the configuration information for a service.
        qdescription----Queries the description for a service.
        qfailure--------Queries the actions taken by a service upon failure.
        delete----------Deletes a service (from the registry).
        create----------Creates a service. (adds it to the registry).
        control---------Sends a control to a service.
        sdshow----------Displays a service's security descriptor.
        sdset-----------Sets a service's security descriptor.
        GetDisplayName--Gets the DisplayName for a service.
        GetKeyName------Gets the ServiceKeyName for a service.
        EnumDepend------Enumerates Service Dependencies.

      The following commands don't require a service name:
      sc <server> <command> <option>
        boot------------(ok | bad) Indicates whether the last boot should
                        be saved as the last-known-good boot configuration
        Lock------------Locks the Service Database
        QueryLock-------Queries the LockStatus for the SCManager Database
  EXAMPLE:
          sc start MyService

Я согласен, что это лучше, чем чистый старт / стоп. Обратите внимание, что есть возможность коснуться служб на удаленных машинах.

Outlaw Programmer 25.09.2008 19:22

Отличный ответ. Но вы должны быть администратором, чтобы запустить «Службу запуска SC». Я нашел решение для этого здесь. (Принятый ответ содержит решение)

Michael K. 18.09.2013 14:37

Проблема с SC заключается в том, что команда возвращается немедленно, а не после завершения действия. Если вы хотите перезапустить службу с помощью командного файла (остановка, затем запуск), останов немедленно вернется, а затем запуск завершится ошибкой, потому что служба не остановлена. Чистая остановка / запуск возвращается после завершения действия, поэтому этой проблемы нет.

Dom 04.01.2014 05:58

Я открыл cmd в режиме администратора и получил сообщение об ошибке. Синтаксис этой команды: NET STOP service.

Satish Singh 08.06.2017 12:12

есть ли способ проверить, правильно ли остановлена ​​служба ?? в 2020?

Anand Varkey Philips 28.05.2020 09:01

SC может делать все со службами ... запускать, останавливать, проверять, настраивать и многое другое ...

или вы можете запустить удаленную службу с помощью этого cmd: sc \<computer> start <service>

Вместо проверки кодов это тоже работает

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  

Меня всегда пугает синтаксис .... так

Здесь явно показано, как добавить строку в пакетный файл, которая убьет удаленную службу (на другом компьютере), если вы являетесь администратором на обеих машинах, запустите .bat от имени администратора, а машины находятся в одном домене. Имя машины соответствует формату UNC \ myserver

sc \ip.ip.ip.ip stop p4_1

В этом случае ... p4_1 был и именем службы, и отображаемым именем, когда вы просматриваете свойства для службы в диспетчере служб. Вы должны использовать имя службы.

Для ваших наркоманов Service Ops ... не забудьте добавить свой код причины и комментарий! например, «4», что равно «Запланировано» и комментарий «Остановка сервера для обслуживания».

sc \ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance

Как мне это сделать, если мне нужно использовать другой идентификатор пользователя и пароль для входа в систему?

Frantumn 26.11.2014 19:58

Вы запускаете CMD как другой пользователь / ID, выполнив runas /user:Domain\UserName cmd, затем введите свой пароль. CMD начнет работать под указанной учетной записью пользователя.

user4317867 30.04.2015 01:46

Хотелось бы думать, что «net stop» остановит сервис. К сожалению, реальность не такая уж черно-белая. Если для остановки службы требуется много времени, команда вернется до того, как служба будет остановлена. Однако вы не узнаете, пока не проверите уровень ошибок.

Решение, похоже, состоит в том, чтобы зацикливаться на поиске состояния службы, пока она не будет остановлена, с паузой каждый раз вокруг цикла.

Но затем снова...

Я вижу, что первая служба долго останавливается, а затем «чистая остановка» для последующей службы просто ничего не делает. Посмотрите на службу в диспетчере служб, и ее состояние по-прежнему «Запущено» - никаких изменений в «Остановка». Тем не менее, я могу остановить эту вторую службу вручную с помощью SCM, и она останавливается через 3 или 4 секунды.

Я создал для этого свой личный командный файл, мой немного отличается, но не стесняйтесь изменять по своему усмотрению. Я создал это некоторое время назад, потому что мне было скучно, и я хотел сделать простой способ, чтобы люди могли вводить окончание, начало, остановку или установку на авто. Этот BAT-файл просто просит вас ввести имя службы, а все остальное он сделает за вас. Я не понимал, что он искал что-то, в котором была бы указана какая-либо ошибка, я, должно быть, неправильно прочитал эту часть. Хотя обычно это можно сделать, введя >> output.txt в конце строки.

% Var% - это просто способ для пользователя ввести в него свою собственную службу, вместо того, чтобы изменять файл bat каждый раз, когда вы хотите запустить / остановить другую службу.

Если я ошибаюсь, любой может меня поправить.

@echo off
set /p c= Would you like to start a service [Y/N]?
  if /I "%c%" EQU "Y" goto :1
  if /I "%c%" EQU "N" goto :2
    :1  
    set /p var= Service name: 
:2 
set /p c= Would you like to stop a service [Y/N]?
  if /I "%c%" EQU "Y" goto :3
  if /I "%c%" EQU "N" goto :4
    :3  
    set /p var1= Service name:
:4
set /p c= Would you like to disable a service [Y/N]?
  if /I "%c%" EQU "Y" goto :5
  if /I "%c%" EQU "N" goto :6
    :5  
    set /p var2= Service name:
:6 
set /p c= Would you like to set a service to auto [Y/N]?
  if /I "%c%" EQU "Y" goto :7
  if /I "%c%" EQU "N" goto :10
    :7  
    set /p var3= Service name:
:10
sc start %var%
sc stop %var1%
sc config %var2% start=disabled
sc config %var3% start=auto

Обычно ответы только на код не приветствуются. Не могли бы вы подробнее рассказать о своем решении или добавить пояснительные комментарии?

an earwig 13.06.2015 04:40

Я создал это некоторое время назад, потому что мне было скучно, и я хотел сделать простой способ, чтобы люди могли вводить окончание, начало, остановку или установку на авто. Этот BAT-файл просто просит вас ввести имя службы, а все остальное он сделает за вас.

Nathanial Wilson 16.06.2015 06:52

Я просто использовал приведенный выше пример Джонаса и создал полный список от 0 до 24 уровней ошибок. Другой пост верен, что net start и net stop используют только errorlevel 0 для успеха и 2 для отказа.

Но вот что сработало для меня:

net stop postgresql-9.1
if %errorlevel% == 2 echo Access Denied - Could not stop service
if %errorlevel% == 0 echo Service stopped successfully
echo Errorlevel: %errorlevel%

Измените stop на start и работает в обратном направлении.

Ручной перезапуск службы в порядке - в services.msc есть кнопка «Перезапустить», но в командной строке как в командах sc, так и в net отсутствует переключатель «перезапуск», и если перезапуск запланирован в файле cmd / bat, служба останавливается и запускается немедленно, иногда это получает сообщение об ошибке, потому что служба еще не остановлена, ему нужно время, чтобы завершить работу.

Это может вызвать ошибку: sc стоп sc start

Хорошая идея - вставить тайм-аут, я использую ping (он пингует каждую секунду): sc стоп пинг localhost -n 60 sc start

Иногда можно обнаружить, что стоп не работает ..

Мой SQlServer иногда делает это. Использование следующей командной строки убивает его. Если вам действительно нужен ваш сценарий, чтобы убивать вещи, которые не останавливаются. Я бы сделал это в крайнем случае

taskkill /pid [pid number] /f

Я пишу службу Windows на C#, цикл остановки / удаления / сборки / установки / запуска стал слишком утомительным. Написал мини-скрипт, назвал его reploy.bat и поместил в выходной каталог Visual Studio (тот, который имеет встроенный исполняемый файл службы), чтобы автоматизировать цикл.

Просто установите эти 3 вара

servicename: отображается на панели управления службами Windows (services.msc)

slndir: папка (не полный путь), содержащая файл вашего решения (.sln)

binpath: полный путь (не путь к папке) к исполняемому файлу службы из сборки

ПРИМЕЧАНИЕ. Это необходимо запустить из командной строки разработчика Visual Studio, чтобы команда msbuild работала.

SET servicename = "My Amazing Service"
SET slndir = "C:dir\that\contains\sln\file"
SET binpath = "C:path\to\service.exe"
SET currdir=%cd%

call net stop %servicename%
call sc delete %servicename%
cd %slndir%
call msbuild 
cd %bindir%
call sc create %servicename% binpath=%binpath%
call net start %servicename%
cd %currdir%

Может это кому-то поможет :)

Вот команда Windows 10 для запуска восстановления системы с помощью пакетной обработки:

sc config swprv start= Auto

Вам также могут понравиться эти команды:

  • Измените значение реестра для автоматического запуска восстановления системы

    REG ADD "HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f

  • Создайте точку восстановления системы

    Wmic.exe / Пространство имен: \ root \ default Путь SystemRestore Вызов CreateRestorePoint «djibe спас ваш компьютер», 100, 12

  • Изменить использование диска для восстановления системы

    vssadmin изменить размер shadowstorage / для = C: / on = C: / maxsize = 10%

Наслаждаться

  1. SC
  2. NET STOP / START
  3. PsService
  4. WMIC
  5. Powershell также является легкий для опции использовать

SC и NET уже даны в качестве предупреждения. PsService добавляет несколько полезных функций, но требует загрузки с сайта Microsoft.

Но мой любимый способ - использовать WMIC, поскольку синтаксис WQL дает мощный способ управлять более чем одной службой с помощью одной строки (объекты WMI также можно использовать через powershell / vbscript / jscript / C#).

Самый простой способ его использования:

wmic service MyService call StartService
wmic service MyService  call StopService

И пример с WQL

wmic service where "name like '%%32Time%%' and ErrorControl='Normal'" call StartService

Это запустит все службы с именем, содержащим 32Time, и нормальным контролем ошибок.

Здесь - это методы, которые вы можете использовать.

С :

wmic service get /FORMAT:VALUE

вы можете увидеть доступную информацию об услугах.

Другие вопросы по теме