Вопрос

Мне нужно знать статус службы в конце моего пакетного скрипта, который перезапускает службы с помощью "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 может перечислить не запущенные службы...

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top