Подтвердить что ты не робот

Команда Windows для получения статуса службы?

Мне нужно знать статус службы в конце моей партии script, которая перезапускает службы, используя "net stop thingie" и "net start thingie".

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

Просто для того, чтобы вы знали, я использую платформу Windows Server 2003, и пакетный файл казался лучшим выбором. Я не против использовать что-то еще, и буду очень открыт для предложений, но только ради знания (как зомби жаждут мозгов, я думал, почему бы не раздуть свои собственные), есть ли команда, которая позволяет мне проверять о статусе службы в командной строке?

Должен ли я просто перенаправить вывод команды в файл?

Где, черт возьми, мои штаны? (Боже, я действительно надеюсь, что юмор, вставленный в это, никого не оскорбит. В это утро в среду и юмор мне тоже нужно: P)

[Изменить:] Решение, которое я использовал (больше не доступно) для загрузки из -link redacted -

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

4b9b3361

Ответ 1

Использование Windows Script:

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

Вы можете легко отфильтровать выше для конкретной услуги, которую вы хотите.

Ответ 2

Вы пробовали 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

Обратите внимание, что внутри пакетного файла вы должны удвоить каждый знак процента.

Ответ 3

Вы можете позвонить net start "service name" в свою службу. Если он не запущен, он запустит его и вернет errorlevel = 0, если он уже запущен, он вернет errorlevel = 2.

Ответ 4

Использование pstools - в частности psservice и "query" - например:

psservice query "serviceName"

Ответ 5

посмотрите также:

NET START | НАЙТИ "Имя службы" > nul  IF errorlevel 1 ECHO Служба не работает

просто скопирован из: http://ss64.com/nt/sc.html

Ответ 6

Если 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

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

Ответ 7

Возможно, это может быть лучший способ запустить службу и проверить результат

Конечно, изнутри Пакета, такого как File.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 или найти после него на трубе будет соответствовать...

Конечно, изнутри Пакета, такого как File.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

Надеюсь, это поможет! Это то, что я обычно использую.

Ответ 8

Ну, я вижу "Ника Кавадиаса", говоря это:

"в соответствии с этим http://www.computerhope.com/nethlp.htm он должен быть NET START/LIST..."

Если вы ввели в Windows XP это:

NET START /LIST

вы получите сообщение об ошибке, просто введите вместо этого

NET START

The/LIST предназначен только для Windows 2000... Если вы полностью прочитали такой веб-сайт, вы увидите, что /LIST находится только в разделе Windows 2000.

Надеюсь, это поможет!!!

Ответ 9

мое намерение состояло в создании script, который включает и выключает службы (в 1 script)

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

my 2 Cents, надеюсь, что это поможет

Ответ 10

Ну, я не уверен, можете ли вы отправить по электронной почте результаты этого из пакетного файла. Если я могу сделать альтернативное предложение, которое решит вашу проблему vbscript. Я очень далек от vbscript, но вы можете использовать его для запроса служб, запущенных на локальной машине. script ниже отправит вам по электронной почте статус всех служб, запущенных на компьютере, на котором запущен script. Очевидно, вы захотите заменить SMTP-сервер и адрес электронной почты. Если вы являетесь частью домена и запускаете этот script как привилегированный пользователь (он должен быть администратором на удаленном компьютере), вы также можете запросить удаленные компьютеры, заменив localhost на fqdn.

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 = "[email protected]"
objMessage.To = "[email protected]"
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

Надеюсь, это вам поможет! Наслаждайтесь!

Изменить: Ahh еще одна вещь, статус службы 4 означает, что служба запущена, статус службы 1 означает, что это не так. Я не уверен, что означает 2 или 3, но я готов поспорить, что они останавливаются/начинаются.

Ответ 11

в соответствии с этим http://www.computerhope.com/nethlp.htm он должен быть NET START/LIST, но я не могу заставить его работать на XP. Я уверен, что есть WMI, который предоставит вам список.

Ответ 12

Ros код я post также предназначен для того, чтобы узнать, сколько сервисов запущено...

Представьте, что вы хотите знать, сколько сервисов похоже на Oracle *, тогда вы ставите Oracle вместо NameOfSercive... и вы получаете количество сервисов, таких как Oracle *, работающих на переменной% CountLines%, и если вы хотите что-то сделать, если есть только 4, вы можете сделать что-то вроде этого:

IF 4 ==% CountLines% GOTO FourServicesAreRunning

Это намного мощнее... и ваш код не позволяет вам узнать, работает ли требуемая служба... если есть еще одна srecive, начинающаяся с того же имени... Представьте себе: -ServiceOne -ServiceOnePersonal

Если вы ищете 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

Конечно, это только список запущенных сервисов, я не знаю, как сеть может перечислить неработающие службы...

Надеюсь, это поможет!!!