2008-12-09 13 views
39

Chciałbym móc zapytać, czy usługa jest uruchamiana z pliku wsadowego systemu Windows. Wiem, że mogę używać:Jak sprawdzić, czy usługa jest uruchomiona z wiersza polecenia

sc query "ServiceName"

ale to zrzuca się jakiś tekst. To, czego naprawdę chcę, to ustawienie zmiennej środowiskowej errorlevel, dzięki czemu mogę podjąć odpowiednie działania.

Czy znasz prosty sposób, w jaki mogę to zrobić?

UPDATE
Dziękuję za odpowiedzi do tej pory. Martwię się, że rozwiązania analizujące tekst mogą nie działać w systemach operacyjnych innych niż angielski. Czy ktoś wie, jak to obejść, czy też będę musiał ugryźć bullet i napisać program konsoli, aby to naprawić.

+0

właśnie testowane na Chiny locale chiński Język Windows 7 laptopem, "query sc ..." wyjście polecenia są nadal angielski. – wangf

+0

Aby uzyskać stan usługi, który będzie łatwy do przeanalizowania przez skrypt bez względu na używany język OS, użyłem 'usługi WMIC Service WHERE" Name = 'SericeName' "GET Started/format: list'. Tworzy 'State = Running' - łatwe do parsowania przez wyrażenie regularne i zawsze w języku angielskim. –

Odpowiedz

63
sc query "ServiceName" | find "RUNNING" 
+1

find nie działa. findstr działa. –

+0

@imkheong, na czym system operacyjny "znajdź" nie działa? to jest na win7 ... –

+0

@ShaiAlon, to było coś, co nie działało. Działa na zwykłym wierszu polecenia (cmd.exe). –

1

Spróbuj

sc query state= all 

na liście usług i czy są one uruchomione, czy nie.

8

Jeśli nie masz nic przeciwko połączeniu polecenia net z grep, możesz użyć następującego skryptu.

@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 
+0

Wygląda na to, że nie mam grepa w moim systemie. Pobrałeś go skądś, jeśli tak, gdzie? –

+0

http://unxutils.sourceforge.net/ –

+2

Użyłem czegoś takiego, ale z "find" zamiast "grep", ponieważ nie chcę polegać na instalowaniu czegokolwiek innego. –

1

Znalazłem to:

sc query "ServiceName" | findstr RUNNING 

wydaje się zrobić z grubsza słusznie. Obawiam się jednak, że nie jest on wystarczająco uogólniony, aby pracować na nieanglojęzycznych systemach operacyjnych.

+0

Jeśli naprawdę potrzebujesz zrobić i18n, powinieneś napisać aplikację, która zapytuje i ustawia poziom błędu. – hometoast

4

Można użyć wmic z opcją /locale

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 
) 
2

Myślenie trochę nieszablonowo tutaj mam zamiar zaproponować, że PowerShell może być odpowiedzią na up-to-date XP/2003 i maszyny na pewno na Vista/2008 i nowszych (zamiast .bat/.cmd). Każdy, kto ma jakiegoś Perla w swoim tle, powinien czuć się w domu dość szybko.


$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"; 
} 

Innym sposobem, jeśli masz znacznych inwestycji w partii jest uruchomienie skryptu PS jako jednego-liner, zwracając kod wyjścia.


@ECHO off 
SET PS=powershell -nologo -command 
%PS% "& {if((get-service SvcName).Status -eq 'Running'){exit 1}}" 

ECHO.%ERRORLEVEL% 

Działając jako pojedynczy liniowiec, można obejść domyślne zasady podpisywania kodu PS kosztem niechlujstwa. Aby umieścić polecenia PS w pliku .ps1 i uruchamiać jak powershell myCode.ps1, może się okazać, że podpisanie skryptów powershell jest konieczne, aby uruchomić je w sposób zautomatyzowany (w zależności od środowiska). Zobacz http://www.hanselman.com/blog/SigningPowerShellScripts.aspx szczegóły

11

Wróćmy do starej szkoły wsadowego programowania na Windows

net start | find "Service Name" 

To będzie działać wszędzie ...

+0

I możesz sprawdzić% poziom błędu później. –

+0

_errorlevel_ ma wartość 1, zarówno gdy usługa istnieje, jak i nie. Więc nie mogę użyć "znaleźć". (Win 7 Pro 64 bit) –

2

Proponuję WMIC Service WHERE "Name = 'SericeName'" GET Started

lub WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId (ProcessId będzie wynosić zero, jeśli usługa nie jest uruchomiona)

Można ustawić poziom błędu na podstawie tego, czy byłe zwraca „true” lub późniejszych powrotów niezerowy

+0

Jest to w rzeczywistości jedyny sposób na uzyskanie stanu usługi, który zawsze zwróci wartość w języku angielskim bez względu na język systemu operacyjnego. –

0

Wystarczy dodać do listy, jeśli używasz Powershell.

sc.exe query "ServiceName" | findstr RUNNING 

Komenda poniżej nie działa, ponieważ sc jest aliasem Set-Content ciągu PowerShell.

sc query "ServiceName" | findstr RUNNING 

find również nie działa na PowerShell z jakiegoś powodu nieznanego do mnie.

sc.exe query "ServiceName" | find RUNNING 
2
sc query "servicename" | findstr STATE

na przykład:

sc query "wuauserv" | findstr STATE

Aby zgłosić co usługa Windows Update robi, działa/wstrzymane itp
Jest to również dla Windows 10. Thank Me Later.

0
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 
0
@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 
+0

Dodaj wyjaśnienie w odpowiedzi na pytanie, w jaki sposób ta odpowiedź pomoże OP w naprawianiu bieżącego problemu –

0

Zastosowanie Cygwin atakujących z:

sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!" 

(Upewnij się, że masz sc.exe w PATH.)

0

zauważyłem nikt nie wspomniał użycie wyrażeń regularnych przy użyciu find/findstr-Odpowiedzi na podstawie. Może to być problematyczne w przypadku usług o podobnej nazwie.

Powiedzmy, że masz dwie usługi, CDPUserSvc i CDPUserSvc_54530

Jeśli używasz większość find/findstr opartych o odpowiedzi tutaj tak daleko, dostaniesz fałszywie dodatnich dla CDPUserSvc zapytaniami kiedy CDPUserSvc_54530 działa tylko.

/r i /c przełączniki findstr może pomóc nam obsłużyć że użycie przypadku, jak również specjalny znak, który wskazuje na koniec linii, $

To zapytanie zweryfikuje tylko funkcjonowanie serwisu CDPUserSvc i ignorować CDPUserSvc_54530

sc query|findstr /r /c:"CDPUserSvc$"

Powiązane problemy