Команда Windows для получения статуса службы?
-
03-07-2019 - |
Вопрос
Мне нужно знать статус службы в конце моего пакетного скрипта, который перезапускает службы с помощью "net stop thingie" и "net start thingie".
В моем самом любимом идеальном мире я хотел бы отправить сообщение о состоянии самому себе по электронной почте, читать холодными зимними ночами, успокаивать себя теплом и комфортом сервера, который, я знаю, работает нормально.
Просто чтобы вы знали, я использую платформу Windows server 2003, и пакетный файл показался мне лучшим выбором.Я не против использовать что-то другое и был бы очень открыт для предложений, но просто ради знаний (поскольку зомби жаждет мозгов, я подумал, почему бы не раздуть свои собственные), есть ли команда, которая позволяет мне проверить статус службы в командной строке?
Должен ли я просто перенаправить вывод команды в файл?
Где, черт возьми, мои штаны?(Боже, я действительно надеюсь, что юмор, вложенный в это, никого не оскорбит.Сегодня утро среды, и юмор мне тоже нужен:P)
[Редактировать:] Решение, которое я использовал, (больше не доступно) для загрузки с --отредактированная ссылка--
Это используется как задание, которое должно быть выполнено в течение ночи, и, проверяя свою электронную почту утром, я вижу, правильно ли перезапустилась служба.
Решение
Использование скрипта Windows:
Set ComputerObj = GetObject("WinNT://MYCOMPUTER")
ComputerObj.Filter = Array("Service")
For Each Service in ComputerObj
WScript.Echo "Service display name = " & Service.DisplayName
WScript.Echo "Service account name = " & Service.ServiceAccountName
WScript.Echo "Service executable = " & Service.Path
WScript.Echo "Current status = " & Service.Status
Next
Вы можете легко отфильтровать все вышеперечисленное для конкретной услуги, которая вам нужна.
Другие советы
Вы пробовали sc.exe
?
C:\> for /f "tokens=2*" %a in ('sc query audiosrv ^| findstr STATE') do echo %b
4 RUNNING
C:\> for /f "tokens=2*" %a in ('sc query sharedaccess ^| findstr STATE') do echo %b
1 STOPPED
Обратите внимание, что внутри пакетного файла вы бы удваивали каждый знак процента.
Ты можешь позвонить net start "service name"
к вашим услугам.Если он не запущен, он запустит его и вернет errorlevel= 0, если он уже запущен, он вернет errorlevel= 2.
Используя инструменты - в частности psservice ( пссервис) и "запрос" - например:
psservice query "serviceName"
посмотри также на него:
NET START | НАЙДИТЕ "Имя службы" > nul ЕСЛИ отображается ошибка уровня 1, служба не запущена
просто скопировано с:http://ss64.com/nt/sc.html
Если PowerShell доступен для вас...
Get-Service -DisplayName *Network* | ForEach-Object{Write-Host $_.Status : $_.Name}
Отдам тебе...
Stopped : napagent
Stopped : NetDDE
Stopped : NetDDEdsdm
Running : Netman
Running : Nla
Stopped : WMPNetworkSvc
Stopped : xmlprov
Вы можете заменить **** Сеть **** на конкретное название службы, если вам просто нужно проверить одну службу.
Возможно, это был бы лучший способ запустить сервис и проверить результат
Конечно, изнутри пакетного файла.BAT разместите что-то вроде этого примера, но просто замените "NameOfSercive" на имя службы, которое вы хотите, и замените строки REM своим собственным кодом:
@ECHO OFF
REM Put whatever your Batch may do before trying to start the service
net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error
REM Put Whatever you want in case Service was not running and start correctly
GOTO ContinueWithBatch
:AlreadyRunning
REM Put Whatever you want in case Service was already running
GOTO ContinueWithBatch
:Error
REM Put Whatever you want in case Service fail to start
GOTO ContinueWithBatch
:ContinueWithBatch
REM Put whatever else your Batch may do
Другое дело - проверить его состояние, не изменяя его, для этого есть гораздо более простой способ сделать это, просто запустите:
net start
Таким образом, без параметров он покажет список со всеми запущенными службами...
Таким образом, простой grep или find после него в трубе подошел бы...
Конечно, изнутри пакетного файла.BAT разместите что-то вроде этого примера, но просто замените "NameOfSercive" на имя службы, которое вы хотите, и замените строки REM своим собственным кодом:
@ECHO OFF
REM Put here any code to be run before check for Service
SET TemporalFile=TemporalFile.TXT
NET START | FIND /N "NameOfSercive" > %TemporalFile%
SET CountLines=0
FOR /F %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
IF 0==%CountLines% GOTO ServiceIsNotRunning
REM Put here any code to be run if Service Is Running
GOTO ContinueWithBatch
:ServiceIsNotRunning
REM Put here any code to be run if Service Is Not Running
GOTO ContinueWithBatch
:ContinueWithBatch
DEL -P %TemporalFile% 2>nul
SET TemporalFile=
REM Put here any code to be run after check for Service
Надеюсь, это может помочь!!Это то, чем я обычно пользуюсь.
Что ж, я вижу, как "Ник Кавадиас" рассказывает об этом:
"согласно этому http://www.computerhope.com/nethlp.htm это должен быть NET START / LIST ..."
Если вы введете в Windows XP это:
NET START /LIST
вы получите сообщение об ошибке, просто введите вместо этого
NET START
СПИСОК / предназначен только для Windows 2000...Если вы полностью прочтете такой веб-сайт, вы увидите, что /LIST находится только в разделе Windows 2000.
Надеюсь, это поможет!!!
мое намерение состояло в том, чтобы создать скрипт, который включает и выключает службы (в 1 скрипте).
net start NameOfSercive 2>nul if errorlevel 2 goto AlreadyRunning if errorlevel 1 goto Error
...
Очень помогло!!TYVM z666
но когда , например ,служба отключена (также errorlevel = 2?), она переходит в "AlreadyRuning" и никогда не переходит в
if errorlevel 1 goto Error ?!!
мне нужен был результат для этого случая ...
:AlreadyRunning net stop NameOfSercive if errorlevel 1 goto Error :Error Echo ERROR!!1! Pause
мои 2 цента, надеюсь, это поможет
Ну, я не уверен, сможете ли вы отправить результаты этого по электронной почте из пакетного файла.Если я могу внести альтернативное предложение, которое решило бы вашу проблему, vbscript.Я далеко не силен в vbscript, но вы можете использовать его для запроса служб, запущенных на локальном компьютере.Приведенный ниже скрипт отправит вам по электронной почте статус всех служб, запущенных на компьютере, на котором запускается скрипт.Очевидно, что вы захотите заменить smtp-сервер и адрес электронной почты.Если вы являетесь частью домена и запускаете этот скрипт как привилегированный пользователь (он должен быть администратором на удаленной машине), вы также можете запрашивать удаленные машины, заменив localhost полным доменным именем.
Dim objComputer, objMessage
Dim strEmail
' If there is an error getting the status of a service it will attempt to move on to the next one
On Error Resume Next
' Email Setup
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Service Status Report"
objMessage.From = "service_report@noreply.net"
objMessage.To = "youraddress@example.net"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.example.net"
'Server port (typically 25)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
Set objComputer = GetObject("WinNT://localhost")
objComputer.Filter = Array("Service")
For Each aService In objComputer
strEmail = strEmail &chr(10) & aService.Name & "=" & aService.Status
Next
objMessage.TextBody = strEmail
objMessage.Configuration.Fields.Update
objMessage.Send
Надеюсь, это поможет вам!Наслаждайтесь!
Редактировать:Ах да, еще одна вещь: статус службы, равный 4, означает, что служба запущена, статус службы, равный 1, означает, что это не так.Я не уверен, что означает 2 или 3, но я готов поспорить, что они останавливаются / запускаются.
в соответствии с этим http://www.computerhope.com/nethlp.htm это должен быть NET START / LIST, но я не могу заставить его работать с помощью XP box.Я уверен, что есть какой-нибудь WMI, который предоставит вам этот список.
Ros код, который я публикую, также предназначен для того, чтобы узнать, сколько служб запущено...
Представьте, что вы хотите знать, сколько сервисов похожи на Oracle *, затем вы вводите Oracle вместо nameofserc...и вы получаете количество служб, таких как Oracle *, запущенных с переменной %CountLines%, и если вы хотите что-то сделать, если их всего 4, вы можете сделать что-то вроде этого:
IF 4==%CountLines% GOTO запускает четыре сервиса
Это гораздо более мощно...и ваш код не позволяет вам узнать , запущена ли нужная служба ...если есть другой результат, начинающийся с того же имени...представьте себе:-ServiceOne -Обслуживающий персонал
Если вы ищете ServiceOne, но он запускает только ServiceOnePersonal, ваш код сообщит, что ServiceOne запущен...
Мой код можно легко изменить, поскольку он считывает все строки файла и читает построчно, он также может делать все, что вы хотите, с каждой службой...видишь это:
@ECHO OFF
REM Put here any code to be run before check for Services
SET TemporalFile=TemporalFile.TXT
NET START > %TemporalFile%
SET CountLines=0
FOR /F "delims=" %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
SETLOCAL EnableDelayedExpansion
SET CountLine=0
FOR /F "delims=" %%X IN (%TemporalFile%) DO @(
SET /A CountLine=1+CountLine
REM Do whatever you want to each line here, remember first and last are special not service names
IF 1==!CountLine! (
REM Do whatever you want with special first line, not a service.
) ELSE IF %CountLines%==!CountLine! (
REM Do whatever you want with special last line, not a service.
) ELSE (
REM Do whatever you want with rest lines, for each service.
REM For example echo its position number and name:
echo !CountLine! - %%X
REM Or filter by exact name (do not forget to not remove the three spaces at begining):
IF " NameOfService"=="%%X" (
REM Do whatever you want with Service filtered.
)
)
REM Do whatever more you want to all lines here, remember two first are special as last one
)
DEL -P %TemporalFile% 2>nul
SET TemporalFile=
REM Put here any code to be run after check for Services
Конечно, это только список запущенных служб, я не знаю, каким образом net может перечислить не запущенные службы...
Надеюсь, это поможет!!!