Время на прочтение
7 мин
Количество просмотров 94K
Туториал
Recovery Mode
Перевод
Начинаем серию переводов, посвященную управлению службами Windows с помощью PowerShell 2.0 и 3.0.
В данном посте будут рассмотрены следующие вопросы управления службами Windows:
- Получаем статус службы на локальном компьютере
- Получаем статус службы на удаленном компьютере
- Осуществляем фильтрацию служб (например, остановленные службы)
- Зависимые службы
Обозначим начальные условия: Вы работаете под Windows 7 и выше и у Вас имеются права администратора. Все команды рекомендуются выполнять в лабораторной или виртуальной среде, перед тем, как применять в “полевых условиях”.
ПОЛУЧАЕМ СТАТУС СЛУЖБЫ
Давайте начнем с того, что просто получим статус всех служб, запущенных на локальном компьютере. Используем для этого командлет Get-Service.
PS C:\> get-service
PowerShell, как правило, не чувствителен к регистру. Вывод приведен на скриншоте ниже.
Каждая строка представляет собой объект службы (service object).Каждый сервисный объект, как правило, имеет свои свойства. Вы можете открыть их, просто передав эти объекты в другую команду, Get-Member.
PS C:\> get-service | get-member
Результаты приведены на скриншоте ниже.
Параметр Typename сверху говорит о том, что за объект перед нами; в данном случае это System.ServiceProcess.ServiceController. На скриншоте также обведены свойства объекта. Это атрибуты, которые описывают этот тип объекта. Хотя большинство из них не используются при отображении по умолчанию, вы можете использовать их, если вы их знаете.
Например, нам интересно посмотреть информацию только о Windows Update. Через Get-Service получим информацию только о некоторых ее свойствах.
PS C:\> get-service wuauserv | select Displayname,Status,Can*
DisplayName : Windows Update
Status : Stopped
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
Как я узнал, что могу напечатать имя службы? Посмотрел с помощью Get-Service.
PS C:\> help get-service
Вы можете получить полную справочную информацию, напечатав:
PS C:\> help get-service –full
Информацию о службе можно получить по ее имени или даже начальным буквам имени.
PS C:\> get-service wi*
Status Name DisplayName
------ ---- -----------
Stopped WiaRpc Still Image Acquisition Events
Running WinDefend Windows Defender Service
Running WinHttpAutoProx... WinHTTP Web Proxy Auto-Discovery Se...
Running Winmgmt Windows Management Instrumentation
Running WinRM Windows Remote Management (WS-Manag...
Или если вам удобнее работать с отображаемыми именами, используйте параметр –Displayname.
PS C:\> get-service -DisplayName "windows a*"
Status Name DisplayName
------ ---- -----------
Stopped AllUserInstallA... Windows All-User Install Agent
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
Я должен использовать имя параметра, чтобы PowerShell воспринимал значения в качестве отображаемого имени, а не фактического имени службы. Команда будет выглядеть так:
PS C:\> get-service "windows a*"
Параметр –Name можно не печатать.
ПОЛУЧАЕМ СТАТУС СЛУЖБЫ НА УДАЛЕННЫХ КОМПЬЮТЕРАХ
До этого нас интересовало получение информации о статусе служб на локальном компьютере. Однако управление службами осуществляется на удаленных компьютерах. Если посмотреть справку по Get-Service, то можно увидеть наличие у этого командлета параметра –Computername. В данном случае подключение к удаленным компьютерам осуществляется без включения функции удаленного управления PowerShell. Если вы можете управлять службами, используя инструменты командной строки (sc.exe или консоль управления Service Manager), вы можете использовать PowerShell. Давайте взглянем на пример:
PS C:\> get-service spooler -ComputerName novo8
Status Name DisplayName
------ ---- -----------
Running spooler Print Spooler
Любая команда, которую я демонстрировал, можно использовать для передачи удаленному компьютеру. Даже нескольким компьютерам, если у вас есть соответствующие права на удаленном компьютере. Если вы используете PowerShell v3, то можно легко выбрать одну службу на множестве компьютеров.
PS C:\> get-service wuauserv -ComputerName chi-dc01,chi-dc02,chi-dc03
Status Name DisplayName
------ ---- -----------
Running wuauserv Windows Update
Stopped wuauserv Windows Update
Running wuauserv Windows Update
Для наглядности представления отформатируем вывод.
PS C:\> get-service wuauserv -ComputerName chi-dc01,chi-dc02,chi-dc03 | format-table Name,Status,Machinename -autosize
Name Status MachineName
---- ------ -----------
wuauserv Running chi-dc03
wuauserv Stopped chi-dc02
wuauserv Running chi-dc01
Тот же самый результат, но в PowerShell v2.
PS C:\> 'chi-dc01','chi-dc02','chi-dc03'| foreach {get-service wuauserv -computername $_} | Format-Table Name,Status,Machinename -AutoSize
Name Status MachineName
---- ------ -----------
wuauserv Running chi-dc01
wuauserv Stopped chi-dc02
wuauserv Running chi-dc03
ОСУЩЕСТВЛЯЕМ ФИЛЬТРАЦИЮ (ИСПОЛЬЗУЯ WHERE-OBJECT)
Фильтрация служб осуществляется с помощью командлета Where-Object (where – сокращение для командлета). Все, что нам нужно от PowerShell в этом случае, так это получить только те службы, у которых статус равен “stopped”.
PS C:\> get-service | where {$_.status -eq 'stopped'}
PowerShell получает информацию обо всех службах и передает их (с помощью “|”) в следующую команду, которая осуществляет просмотр каждого объекта. Если свойство статуса объекта равно “stopped”, она остается в конвейере (pipeline), в противном случае она из него исключается. В конце выражение PowerShell отображает те объекты, которые остались в конвейере.
Результаты приведены ниже.
Теперь давайте попробуем найти одну службу на нескольких машинах. Вывод отформатируем в таблицу.
PS C:\> get-service -computername @('chi-dc01','chi-dc02','chi-dc03') | where {$_.name -eq 'wuauserv'} | format-table Name,Status,Machinename -autosize
Name Status MachineName
---- ------ -----------
wuauserv Running chi-dc02
wuauserv Running chi-dc01
wuauserv Running chi-dc03
Мы даже можем комбинировать запрос отдельных служб с их фильтрацией.
PS C:\> get-service "win*" -comp chi-dc03 | where {$_.status -eq 'running'}
Status Name DisplayName
------ ---- -----------
Running Winmgmt Windows Management Instrumentation
Running WinRM Windows Remote Management (WS-Manag...
Эта команда находит все службы на компьютере CHI-DC03, которые начинаются с ‘WIN’, но отображает только те, которые запущены.
Также можно сгруппировать объекты по свойству статуса (status property).
PS C:\> $dc03 = get-service -computername chi-dc03 | Group-Object -Property Status
Переменная $dc03 является объектом GroupInfo.
PS C:\> $dc03
Count Name Group
----- ---- -----
64 Running {System.ServiceProcess.ServiceController, Sy...
79 Stopped {System.ServiceProcess.ServiceController, Sy...
Свойство Group представляет собой коллекцию связанных служб.
PS C:\> $dc03.Get(0).group
Написанное выше проще понять, если взглянуть на скриншот.
Что касается меня, то я бы предпочел использовать хеш-таблицу.
PS C:\> $hash = get-service -computername chi-dc03 | Group-Object -Property Status -AsHashTable
PS C:\> $hash
Name Value
---- -----
Running {System.ServiceProcess.ServiceController, Sys...
Stopped {System.ServiceProcess.ServiceController, Sys...
Теперь каждое имя представляет собой свойство в хеш-таблице. Если у вас имеется опыт работы с PoweShell, вы, возможно, подумываете сделать сделующее:
PS C:\> $hash.running.count
Однако ничего не произойдет. Потому что свойство Status является просто перечислением (enumeration) для [System.ServiceProcess.ServiceControllerStatus] .NET клас и такие свойства, как Running и Stopped представляют собой целые числа. PowerShell осуществляет конвертацию, чтобы представить в более наглядной форме.
PS C:\> $hash = get-service -computername chi-dc03 | Group-Object -Property Status –AsHashTable –AsString
В чем суть параметра –AsString, на мой взгляд, достаточно очевидно. Теперь работать с хеш-таблицей стало проще.
PS C:\> $hash.running.count
62
PS C:\> $hash.running[0..3]
Status Name DisplayName
------ ---- -----------
Running ADWS Active Directory Web Services
Running AppHostSvc Application Host Helper Service
Running BFE Base Filtering Engine
Running BrokerInfrastru... Background Tasks Infrastructure Ser...
Следующей задачей на повестке дня является проверка зависимостей сервера (server dependencies).
Требуемые службы
PowerShell позволяет просто получить статус всех служб, которые требуется для данной службы, даже на удаленном компьютере.
PS C:\> get-service dns -ComputerName chi-dc03 –RequiredServices
Status Name DisplayName
------ ---- -----------
Running Afd Ancillary Function Driver for Winsock
Running Tcpip TCP/IP Protocol Driver
Running RpcSs Remote Procedure Call (RPC)
Running NTDS Active Directory Domain Services
Параметр –RequiredServices передаст объект в конвейер для каждой требуемой службы. Вы можете даже пойти дальше и проверить требуемые службы для работы данной службы.
PS C:\> get-service dns -ComputerName chi-dc03 -RequiredServices | select name,@{name="computername";expression={$_.machinename}} | get-service -RequiredServices
Status Name DisplayName
------ ---- -----------
Running RpcEptMapper RPC Endpoint Mapper
Running DcomLaunch DCOM Server Process Launcher
Параметр –Computername командлета Get-Service возьмет вывод, но только для тех объектов, у которых есть объект свойство Computername – именно поэтому я использую хеш-таблицу с Select-Object. Как мы видим проблем со службой DNS на компьютере CHI-DC03 нет.
ЗАВИСИМЫЕ СЛУЖБЫ
Мы можем сделать то же самое с зависимыми службами. Если таковых не имеется, в конвейер ничего передано не будет.
PS C:\> get-service dns -ComputerName chi-dc03 -DependentServices
PS C:\> get-service lanmanworkstation -ComputerName chi-dc03 -DependentServices
Status Name DisplayName
------ ---- -----------
Stopped SessionEnv Remote Desktop Configuration
Running Netlogon Netlogon
Running Dfs DFS Namespace
Running Browser Computer Browser
Требуемые и зависимые службы также являются частью каждого объекта службы.
PS C:\> get-service rpcss | Select *services
RequiredServices DependentServices
---------------- -----------------
{RpcEptMapper, DcomLaunch} {WwanSvc, wuauserv, WSearch, wscsvc...}
А пока Вы можете получить все зависимости для всех служб, следующая команда
PS C:\> get-service –DependentServices
Это не даст вам особо полезную информацию, поэтому я рекомендую осуществлять запрос по конкретным службам. Команда работает гораздо лучше PowerShell v3.
PS C:\> get-service dns -comp chi-dc01,chi-dc03 -RequiredServices | Sort Machinename,Name | Format-table -GroupBy machinename
Результаты видны на скриншоте ниже.
Чтобы получить подобные результаты в PowerShell v2, вам придется передать имена компьютеров (computernames) в Get-Service.
PS C:\> "chi-dc01","chi-dc03" | foreach { get-service dns -comp $_ -RequiredServices} | Sort Machinename,Name | format-table -GroupBy machinename
В следующей статье будет рассмотрен запуск, остановка и перезапуск служб.
Конец перевода.
Upd:
В посте приведены переводы статей с портала 4sysops.com
Managing Services the PowerShell way – Part 1
Managing Services the PowerShell way – Part 2
P.S. Хотим также поделиться нашей бесплатной программой для управления службами Windows – NetWrix Service Monitor. Программа отслеживает все автоматически запускаемые службы на группе серверов и в случае внезапного сбоя одной или нескольких из них отправляет уведомления по электронной почте. Функция перезапуска гарантирует, что все подконтрольные службы будут работать без простоев. Программа проста в настройке: устанавливаем, вводим имена компьютеров и указываем нужный адрес электронной почты.
С помощью командлета Get-Service можно получить список всех установленных в системе служб, их состояние и тип запуска. Этот и другие командлеты для получения статуса и управления службами Windows впервые появился в версии Powershell 1.0. В этой статье мы разберем типовые примеры использования Get-Service для получения статуса служб на локальном или удаленных компьютерах, типе запуска служб и покажем как определять зависимости служб.
Получить список служб, установленных на локальном или удаленном компьютере можно с помощью командлета Get-Service. Команда Get-Service без параметров возвращает список всех служб на локальной системе.
Get-Service
Данная команда выведет список всех служб и их статус (запущена или остановлена) и отображаемое имя (Display Name).
Если вам нужно вывести только запушенные службы, воспользуемся такой командой:
Get-Service | Where-Object {$_.Status -EQ "Running"}
Оператор конвейера (|) передает результаты командлету Where-Object, который отбирает только те службы, для которых параметр Status имеет значение Running. В том случае, если нужно вывести только остановленные службы, укажите значение Stopped.
Получить все свойства объекта службы можно с помощью командлета Get-Member.
get-service | get-member
Как вы видите, данный объект имеет тип (Typename) System.ServiceProcess.ServiceController. На скриншоте выведены все доступные свойства и методы объектов служб в системе (большинство из них не используются при отображении по умолчанию).
Чтобы вывести определенные свойства службы, нужно воспользоваться возможностями выбора свойств объектов с помощью командлета Select. Например, нам нужно вывести имя, статус и доступные возможности службы Windows Update:
get-service wuauserv | select Displayname,Status,ServiceName,Can*
DisplayName : Windows Update
Status : Stopped
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
К примеру, чтобы получить тип запуска служб Windows, выполните команду (работает в PowerShel 5.1):
Get-Service | select -property name,starttype
Можно отфильтровать полученный список по имени службы, используя звездочку как подстановочный знак:
get-service wi*
Так можно отсортировать список служб компьютера в порядке убывания по значению свойства Status. Запущенные службы отображаются раньше остановленных.
get-service s* | sort-object status -Descending
В том случае, если нужно проверить наличие (существование) службы в системе (как правило, это может понадобиться в различных скриптах), вы можете воспользоваться такой конструкцией:
if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)
{
Write-host "ServiceTest exists"
}
Командлет Get-Service можно использовать для получения статуса служб не только на локальном, но и удаленных компьютерах. Для этого нужно использовать аргумент –Computername. Подключение к удаленным компьютерам осуществляется не через PowerShell Remoting (WinRM), а через службу Service Manager (по аналогии с командой sc.ex).
get-service wuauserv -ComputerName remotePC1
Если вы используете PowerShell v3 или выше, то можно опросить статус службы сразу на множестве удаленных компьютерах, их имена нужно перечислить через запятую.
get-service spooler -ComputerName remotePC1,remotePC2, remotePC3| format-table Name,Status,Machinename –autosize
Командлет format-table используется в данном примере для получения более удобного табличного представления состояния служб.
Командлет Get-Service имеет еще два параметра, которые удобно использовать при администрировании служб. Параметр DependentServices получает службы, которые зависят от данной службы. Параметр RequiredServices получает службы, от которых зависит данная служба.
Приведенная ниже команда выводит список служб, требуемых службе LanmanWorkstation для запуска.
Get-Service -Name LanmanWorkstation –RequiredServices
Status Name DisplayName
—— —- ————
Running NSI Network Store Interface Service
Running MRxSmb20 SMB 2.0 MiniRedirector
Running Bowser Browser Support Driver
Следующая команда выводит зависимые службы (подробнее о настройке зависимостей служб в Windows), которым требуется служба LanmanWorkstation.
Get-Service -Name LanmanWorkstation -DependentServices
Как в командном файле получить список служб Windows? Как узнать, установлена ли определённая служба? Как проверить её состояние? Как её перезапустить?
Получить ответы на эти важные вопросы помогут команды SC и NET.
Для получения списка служб используется команда:
sc query type= service
Она перечисляет службы, выводя для каждой следующую информацию:
Имя_службы: wuauserv Выводимое_имя: Центр обновления Windows Тип : 20 WIN32_SHARE_PROCESS Состояние : 4 RUNNING (STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN) Код_выхода_Win32 : 0 (0x0) Код_выхода_службы : 0 (0x0) Контрольная_точка : 0x0 Ожидание : 0x0
Важно, что язык вывода может быть разным (зависит от языковой версии Windows, региональных настроек), т.е. при написании командного файла необходимо учитывать, что вывод для той же службы может быть и таким:
SERVICE_NAME: wuauserv DISPLAY_NAME: Automatic Updates TYPE : 20 WIN32_SHARE_PROCESS STATE : 4 RUNNING (STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0
Проверить наличие определённой службы можно поиском, например:
sc query type= service | findstr /i "wuauserv"
Если служба существует, вывод будет содержать строчку, а код возврата будет 0.
Если такой службы нет, вывод будет пустым, а код возврата 1.
Важно! В качестве строки поиска здесь используется внутреннее имя службы, которое не зависит от языковых настроек (DISPLAY_NAME зависит).
Для проверки конфигурации и статуса можно использовать команду SC QUERY
, команда работает с внутренними именами, поэтому для проверки службы Планировщик задач можно написать SC QUERY schedule
, и это будет работать везде. Проверить, запущена ли служба, можно по наличию строки RUNNING или STOPPED:
sc query schedule | find "RUNNING"
Команда NET START
перечисляет все запущенные службы по одной на строчку, что делает работу с ней простой, например, проверить, что служба запущена, можно командой NET START | find «Планировщик заданий». Но необходимо учитывать, что эта команда работает с пользовательскими именами (Display Name) служб и приведённая команда не сработает в англоязычных региональных настройках.
Is there any Windows command which will show the status of a single service?
For example, I want to know whether «IIS admin service» is running or not. If it is running the command ouput should be «running».
I tried sc query type= service state= all | find "IIS Admin Service"
which displayed the output:
«DISPLAY_NAME: IIS Admin Service»
I also tried net start "IIS Admin Service" | find "Running"
which displays:
The requested service has already been started.
More help is available by typing NET HELPMSG 2182.
But it doesn’t give me an output such as
«service name» = running / disabled / stopped
Is there a command which has output in this format?
TRiG
1,1813 gold badges13 silver badges30 bronze badges
asked Feb 8, 2016 at 15:32
Use the service name and not the display name
sc query iisadmin
jscott
24.5k8 gold badges79 silver badges100 bronze badges
answered Feb 8, 2016 at 15:45
2
You can use Powershell thus:
Get-Service -name 'IIS Admin Service'
jscott
24.5k8 gold badges79 silver badges100 bronze badges
answered Feb 8, 2016 at 15:48
vigilemvigilem
5792 silver badges7 bronze badges
This works fine:
sc query "service name" | FIND /C "RUNNING"
%ERRORLEVEL% is either 0 of the service is running, or 1 if it’s not. No need for 3rd party tools.
To catch the output of FIND you can use something like this:
sc query "service name" | FIND /C "RUNNING" >NUL && echo Service is running || echo Service is stopped
answered Jan 25 at 10:10
If you’re willing to use the excellent Cygwin
bash, you can simply write:
sc query "Bonjour Service" |grep -qo RUNNING && echo "Bonjour is ok!" || echo "Apple Bonjour Service not running"
The trick here is to have a proper grep
available, so that in this way you can catch the true/false (success) status of command. Here -q
is for silent and -o
is for just returning the exact match and can probably be omitted. And yes, you need to put your «sc.exe» in your PATH.
answered Dec 18, 2017 at 7:57
not2qubitnot2qubit
2811 gold badge3 silver badges10 bronze badges
You must log in to answer this question.
Not the answer you’re looking for? Browse other questions tagged
.
Not the answer you’re looking for? Browse other questions tagged
.
I would like to be able to query whether or not a service is running from a windows batch file. I know I can use:
sc query «ServiceName»
but, this dumps out some text. What I really want is for it to set the errorlevel
environment variable so that I can take action on that.
Do you know a simple way I can do this?
UPDATE
Thanks for the answers so far. I’m worried the solutions that parse the text may not work on non English operating systems. Does anybody know a way around this, or am I going to have to bite the bullet and write a console program to get this right.
asked Dec 9, 2008 at 15:37
Scott LanghamScott Langham
58.8k40 gold badges132 silver badges204 bronze badges
2
sc query "ServiceName" | find "RUNNING"
answered Dec 9, 2008 at 15:46
Igal SerbanIgal Serban
10.6k3 gold badges36 silver badges40 bronze badges
5
Let’s go back to the old school of batch programing on windows
net start | find "Service Name"
This will work everywhere…
RealHowTo
35k11 gold badges72 silver badges85 bronze badges
answered Mar 23, 2011 at 14:22
ShahinShahin
1911 silver badge2 bronze badges
6
if you don’t mind to combine the net command with grep you can use the following script.
@echo off
net start | grep -x "Service"
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:end
answered Dec 9, 2008 at 15:48
5
You could use wmic with the /locale option
call wmic /locale:ms_409 service where (name="wsearch") get state /value | findstr State=Running
if %ErrorLevel% EQU 0 (
echo Running
) else (
echo Not running
)
answered Dec 28, 2008 at 19:05
NicJNicJ
4,0701 gold badge25 silver badges18 bronze badges
Thinking a little bit outside the box here I’m going to propose that powershell may be an answer on up-to-date XP/2003 machines and certainly on Vista/2008 and newer (instead of .bat/.cmd). Anyone who has some Perl in their background should feel at-home pretty quickly.
$serviceName = "ServiceName";
$serviceStatus = (get-service "$serviceName").Status;
if ($serviceStatus -eq "Running") {
echo "Service is Running";
}
else {
#Could be Stopped, Stopping, Paused, or even Starting...
echo "Service is $serviceStatus";
}
Another way, if you have significant investment in batch is to run the PS script as a one-liner, returning an exit code.
@ECHO off
SET PS=powershell -nologo -command
%PS% "& {if((get-service SvcName).Status -eq 'Running'){exit 1}}"
ECHO.%ERRORLEVEL%
Running as a one-liner also gets around the default PS code signing policy at the expense of messiness. To put the PS commands in a .ps1 file and run like powershell myCode.ps1
you may find signing your powershell scripts is neccessary to run them in an automated way (depends on your environment). See http://www.hanselman.com/blog/SigningPowerShellScripts.aspx for details
answered Jul 20, 2009 at 20:48
@ECHO OFF
REM testing at cmd : sc query "MSSQLSERVER" | findstr RUNNING
REM "MSSQLSERVER" is the name of Service for sample
sc query "MSSQLSERVER" %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo Oh noooo.. trouble mas bro
goto end
:started
echo "SQL Server (MSSQLSERVER)" is started
goto end
:stopped
echo "SQL Server (MSSQLSERVER)" is stopped
echo Starting service
net start "MSSQLSERVER"
goto end
:erro
echo Error please check your command.. mas bro
goto end
:end
answered Dec 23, 2016 at 2:42
1
I would suggest
WMIC Service WHERE "Name = 'SericeName'" GET Started
or WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId
(ProcessId will be zero if service isn’t started)
You can set the error level based on whether the former returns «TRUE» or the latter returns nonzero
answered Dec 14, 2012 at 20:27
Mark SowulMark Sowul
10.3k1 gold badge45 silver badges51 bronze badges
1
sc query "servicename" | findstr STATE
for example:
sc query "wuauserv" | findstr STATE
To report what the Windows update service is doing, running/paused etc.
This is also for Windows 10. Thank me later.
answered Dec 1, 2016 at 5:08
QuackQuack
391 bronze badge
Try
sc query state= all
for a list of services and whether they are running or not.
answered Dec 9, 2008 at 15:47
GalwegianGalwegian
41.5k16 gold badges112 silver badges158 bronze badges
I’ve found this:
sc query "ServiceName" | findstr RUNNING
seems to do roughly the right thing. But, I’m worried that’s not generalized enough to work on non-english operating systems.
RealHowTo
35k11 gold badges72 silver badges85 bronze badges
answered Dec 9, 2008 at 15:48
Scott LanghamScott Langham
58.8k40 gold badges132 silver badges204 bronze badges
2
Just to add on to the list if you are using Powershell.
sc.exe query "ServiceName" | findstr RUNNING
The command below does not work because sc
is an alias to Set-Content within Powershell.
sc query "ServiceName" | findstr RUNNING
find
also does not work on Powershell for some reason unknown to me.
sc.exe query "ServiceName" | find RUNNING
answered Aug 4, 2016 at 9:07
Chris VoonChris Voon
1,9742 gold badges18 silver badges11 bronze badges
SERVICO.BAT
@echo off
echo Servico: %1
if "%1"=="" goto erro
sc query %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:erro
echo sintaxe: servico NOMESERVICO
goto end
:end
thor
21.5k31 gold badges88 silver badges174 bronze badges
answered Dec 5, 2016 at 18:53
I noticed no one mentioned the use of regular expressions when using find
/findstr
-based Answers. That can be problematic for similarly named services.
Lets say you have two services, CDPUserSvc
and CDPUserSvc_54530
If you use most of the find
/findstr
-based Answers here so far, you’ll get false-positives for CDPUserSvc
queries when only CDPUserSvc_54530
is running.
The /r
and /c
switches for findstr
can help us handle that use-case, as well as the special character that indicates the end of the line, $
This query will only verify the running of the CDPUserSvc
service and ignore CDPUserSvc_54530
sc query|findstr /r /c:"CDPUserSvc$"
answered Feb 13, 2018 at 5:45
A suggested approach can be found in an answer to a related question: target very specific things which are locale-independent. In this case, for obtaining service status from sc.exe
, the integer which identifies the state was found to be independent of active language and, therefore, robust.
Short example (additional details in the linked answer):
for /F "skip=3 tokens=3" %%i in ('""%windir%\system32\sc.exe" query "W32Time" 2^>nul"') do (
if "%%i"=="4" (
echo 'W32Time' service is running
goto :SkipRemainingIterations
)
)
:SkipRemainingIterations
answered Jun 15 at 23:03
Use Cygwin Bash with:
sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!"
(Make sure you have sc.exe
in your PATH.)
answered Dec 18, 2017 at 8:02
not2qubitnot2qubit
14.7k8 gold badges97 silver badges137 bronze badges
I have created one based from above but will show if the service is installed first then get whether it is running or not.
sc query "YourService" | find /i "failed" 2>&1>nul && echo.'YourService Not Installed' || (sc query "YourService"| find /i "running" 2>&1>nul && echo.Yes || echo.No)
answered Nov 1, 2021 at 15:52
1