Войти

Показать полную графическую версию : Проверка состояния службы. Возврат значения из CMD. Непредвиденное появление.


amazzzing
29-11-2013, 23:09
Есть CMD из которого надо получить результат состояния службы. Хотелось использовать его как функцию в процедурных языках :)
При работе результат выдает верный, но перед ним выводит "Непредвиденное появление"
Хотелось бы чтобы просто выдавал числовое значение.

В параметрах имя сервера и службы передаю в кавычках.



@echo off

for /f "tokens=1,4" %%i in ('sc %~1 query %~2') do (
if "%%i"=="Состояние" (
if "%%j"=="RUNNING" (set do=0) else (set do=1)
)
)
rem service is NOT running!
if %do% EQU 1 > 0

rem service is running.
if %do% EQU 0 > 1

rem service state unknown.
if %do% EQU 0 > -1

Iska
30-11-2013, 01:41
Хотелось использовать его как функцию в процедурных языках »
Не нужно. Wbem доступен ещё с Windows 98. Для любого языка, поддерживающего Automation. Пример на WSH, подробно:
Option Explicit

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx


strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set objSWbemObjectEx = objSWbemServicesEx.Get("Win32_Service.Name='wuauserv'")

WScript.Echo objSWbemObjectEx.State

Set objSWbemLocator = Nothing
Set objSWbemObjectEx = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0

Тот же пример, коротко ;):
WScript.Echo GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").Get("Win32_Service.Name='wuauserv'").State

Так, кажется, я всё-таки понял Вашу мысль. Держите процедуру с примерами использования:
@echo off
setlocal enableextensions enabledelayedexpansion

call :GetServiceState "lanmanserver"
echo lanmanserver: %ServiceState%

call :GetServiceState "wuauserv"
echo wuauserv: %ServiceState%

call :GetServiceState "bla-bla-bla"
echo bla-bla-bla: %ServiceState%

endlocal
exit /b 0

:GetServiceState
setlocal enableextensions enabledelayedexpansion
set sOut=%~0
set sServiceName=%~1

for /f "usebackq" %%i in (
`wmic.exe Service where "Name='%sServiceName%'" get State /value 2^>nul ^| find.exe /i "State"`
) do set b%%~i

if not defined bState set bState=Not found [%sServiceName%] service

endlocal & set %sOut:~4%=%bState%
exit /b




© OSzone.net 2001-2012