Я хочу записать пакетный файл, который выполняет следующие операции:
Примеры кода, которые я погуглил до сих пор, оказалось, не работали, таким образом, я решил не отправить их.
Запуск сервиса сделан:
net start "SERVICENAME"
Чтобы проверить состояние службы, используйте sc query
. Что касается блоков if в пакетных файлах, ознакомьтесь с документацией.
Следующий код проверит состояние службы MyServiceName
и запустит ее, если она не запущена (блок if будет выполнен, если служба не запущена):
for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName" ^| findstr " STATE"') do (
if /I "%%H" NEQ "RUNNING" (
REM Put your code you want to execute here
REM For example, the following line
net start "MyServiceName"
)
)
Объяснение того, что он делает:
Что касается второго вопроса, аргументом, который вы хотите передать net start
, является имя службы, а не отображаемое имя.
Это должно сработать:
FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING"
IF ERRORLEVEL 1 SC start %%a)
Вы можете использовать следующую команду, чтобы узнать, запущена служба или нет:
sc query [ServiceName] | findstr /i "STATE"
Когда я запускаю это для моего антивируса NOD32, я получаю:
STATE : 4 RUNNING
Если бы он был остановлен, я бы получил:
STATE : 1 STOPPED
Вы можете использовать это в переменной, чтобы затем определить, используете ли вы NET START или нет.
Имя службы должно быть именем службы, а не отображаемым именем.