Вы должны войти, чтобы создавать сообщения и темы.

Проверка типа запуска службы в bat [Решено]

Всем привет 🖐
Подскажите, как проверить тип запуска службы через bat, и если служба выключена - выполнить одно действие, если автоматический запуск - другое.

👋

Проверка нескольких служб с проверкой на их существование, по sc query

@echo off&title ServiceCheck

rem Изменить список на свой
set "ServName=DPS" && call :Check

set "ServName=1234" && call :Check

set "ServName=ClipSvc" && call :Check

set "ServName=TokenBroker" && call :Check

pause&exit

:Check
rem Проверка состояния
sc query %ServName% >nul 2>&1||echo Служба %ServName% не существует && set "ServName=" && exit /b
sc query %ServName% | find /i "RUNNING" >nul 2>&1 && echo Служба %ServName% запущена||echo Служба %ServName% не запущена
set "ServName=" && exit /b


Проверка нескольких служб с проверкой на их существование, через реестр

Check

@echo off&title ServiceCheck

rem Изменить список на свой
set "ServName=DPS" && call :Check&echo.

set "ServName=1234" && call :Check&echo.

set "ServName=ClipSvc" && call :Check&echo.

set "ServName=TokenBroker" && call :Check&echo.

pause>nul&exit

:Check
rem Проверка состояния
reg query "HKLM\System\ControlSet001\Services\%ServName%" >nul 2>&1||echo Служба %ServName%. Не существует [-] && set "ServName=" && exit /b
reg query "HKLM\System\ControlSet001\Services\%ServName%" /v "Start" | find /i "0x2" >nul 2>&1 && echo Служба %ServName%. Тип запущена - автоматически - [2] && set "ServName=" && exit /b
) || (
reg query "HKLM\System\ControlSet001\Services\%ServName%" /v "Start" | find /i "0x3" >nul 2>&1 && echo Служба %ServName%. Тип запуска - вручную [3] && set "ServName=" && exit /b
echo Служба %ServName%. Тип запуска отключено - [4] && set "ServName=" && exit /b


Проверка одной службы с проверкой на ее наличие

@Echo off&title CheckService

rem Проверка состояния службы DPS, изменить имя на свое
sc query DPS >nul 2>&1
if errorlevel 1 (echo Службы DPS не существует && .............) else (
sc query DPS | find /i "RUNNING" >nul 2>&1
if errorlevel 1 (echo Служба DPS не запущена && ...........) else (echo Служба DPS запущена && ..........))
pause&exit

Лайкнули Psydiant и Сергей
PsydiantСергей

Vlado, большое спасибо, это именно то что было нужно (даже больше).

У меня ещё есть проблема, не выполняются команды при таком вводе: СкопированоTI.exe cmd.exe /c /min sc config ClipSVC start=auto & net start ClipSVC, если /min убрать, то выполняется только первая команда, подскажите что я делаю не так, если кто-то знает.

Сергей,

sc query ClipSvc | find /i "RUNNING" >nul 2>&1
if errorlevel 1 (
echo Служба не запущена, запускаем ...&echo.
TI.exe start cmd.exe /c /min sc config ClipSVC start=auto && net start /y ClipSvc
) else (
echo Служба запущена, останавливаем ...&echo.
TI.exe start cmd.exe /c /min sc config ClipSVC start=disabled && net stop /y ClipSvc
)

Если ты хочешь спрятать мигающее окно консоли при выполнении команд от TI, воспользуйся таким способом. Берешь nircmd и это, кладешь в рабочий каталог своего батника, либо в %SystemRoot% (C:\Windows)

@echo off
rem Если NirCmd.exe и TrInstaller.exe рядом с батником.
cd /d "%~dp0"
///////
rem Если NirCmd.exe и TrInstaller.exe находятся в ПАПКЕ 'Work' (изменить на свое имя) рядом с батником
cd /d "%~dp0Work"
///////
rem Если NirCmd.exe и TrInstaller.exe находятся в %SystemRoot%, то использовать переход cd /d не требуется, поскольку консоль напрямую взаимодействует из %SystemRoot%

rem ------------------------------------------
rem Переменная для использования команд от имени TI
set "TI=nircmd execmd TrInstaller /c nircmd execmd"
rem ------------------------------------------
%TI% sc config ClipSVC start=auto && net start /y ClipSvc
%TI% sc config ClipSVC start=disabled && net stop /y ClipSvc
%TI% schtasks /Change /TN "Microsoft\Windows\UpdateOrchestrator\Report policies" /Disable
и др.
Лайкнул Сергей
Сергей

Vlado, ещё раз, большое спасибо за помощь.
А зачем нужен /y? Что он делает?

Сергей, Автоматический ответ на запрос о подтверждении. /y(yes) /n(no)

Лайкнул Сергей
Сергей

Vlado, понял, так и думал, но показалось странным что он не нужен если вводить команду отдельно, поэтому решил что это что-то другое.
Ещё раз спасибо, вопрос решён.

Лайкнул Vlado
Vlado

Как оказалось, эта команда не устанавливает службе режим запуска автоматический, cmd файл просто игнорирует первую команду, но пытается запустить выключенную службу, я вообще не понимаю почему не срабатывает:

TI.exe start cmd.exe /c /min sc config ClipSVC start=auto && net start /y ClipSvc

 

Сергей, Да, сейчас попробовал, тут сам TI.exe не хочет работать с /min

TI.exe notepad.exe - работает

TI.exe start /min notepad.exe - не работает, хотя в обычной CMD:
start /min notepad.exe - работает

Вот такой вариант работает, но опять же, если цель спрятать моргающее окно CMD, то с TI.exe я так и не смог найти решения, сколько перебирал различных комбинаций.

TI.exe %comspec% /c sc config ClipSvc start=auto && net start /y ClipSvc

Vlado, что-то всё равно плохо работает, выполняет теперь только первую команду =)
В любом случае спасибо за помощь, буду пробовать TrInstaller.