Jak sprawdzić, czy usługa jest uruchomiona z wiersza poleceń

głosy
42

Chciałbym, aby móc zapytać, czy dana usługa jest uruchomiona z pliku wsadowego okien. Wiem, że mogę używać:

sc query ServiceName

ale, to zrzuca się jakiś tekst. Co naprawdę chcę to na to, aby ustawić errorlevelzmienną środowiskową, aby można było podjąć działania w tej sprawie.

Czy wiesz, że w prosty sposób można to zrobić?

UPDATE
Dzięki za odpowiedzi tak daleko. Martwię się, że rozwiązania analizowania tekstu może nie działać na systemach operacyjnych innych niż angielskie. Czy ktoś zna sposób wokół tego, czy będę musiał zacisnąć zęby i napisać program konsoli do uzyskania tego prawa.

Utwórz 09/12/2008 o 14:37
źródło użytkownik
W innych językach...                            


14 odpowiedzi

głosy
65

sc query "ServiceName" | find "RUNNING"
Odpowiedział 09/12/2008 o 14:46
źródło użytkownik

głosy
1

Próbować

sc query state= all 

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

Odpowiedział 09/12/2008 o 14:47
źródło użytkownik

głosy
8

jeśli nie masz nic przeciwko temu, aby połączyć się z polecenia net z grep można 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
Odpowiedział 09/12/2008 o 14:48
źródło użytkownik

głosy
1

Znalazłem to:

  sc query "ServiceName" | findstr RUNNING  

wydaje się zrobić z grubsza słusznie. Ale obawiam się, że nie jest wystarczająco uogólnione do pracy non-angielskie systemów operacyjnych.

Odpowiedział 09/12/2008 o 14:48
źródło użytkownik

głosy
4

Można użyć wmic z / locale opcji

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
)
Odpowiedział 28/12/2008 o 18:05
źródło użytkownik

głosy
2

Myślenie trochę nieszablonowo tutaj mam zamiar zaproponować, że PowerShell może być odpowiedź na XP / Maszyny up-to-date 2003 i na pewno na Vista / 2008 i nowszych (zamiast bat / cmd). Każdy, kto ma trochę Perl w ich 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ła jako jedną wkładką także dostaje wokół domyślne PS polityki podpisywania kodu kosztem niechlujstwo. Aby umieścić polecenia PS w pliku .ps1 i biegać jak powershell myCode.ps1was mogą znaleźć podpisaniu skryptów PowerShell jest konieczne, aby uruchomić je w sposób automatyczny (zależnie od środowiska). Zobacz http://www.hanselman.com/blog/SigningPowerShellScripts.aspx o szczegóły

Odpowiedział 20/07/2009 o 19:48
źródło użytkownik

głosy
14

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

net start | find "Service Name"

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

Odpowiedział 23/03/2011 o 13:22
źródło użytkownik

głosy
2

sugerowałbym WMIC Service WHERE "Name = 'SericeName'" GET Started

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

Można ustawić poziom błędu na podstawie tego, czy byłe zwraca „true” lub ostatnie powraca niezerowe

Odpowiedział 14/12/2012 o 18:27
źródło użytkownik

głosy
0

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

sc.exe query "ServiceName" | findstr RUNNING

Komenda poniżej nie działa, ponieważ scjest aliasem do 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
Odpowiedział 04/08/2016 o 08:07
źródło użytkownik

głosy
2
sc query "nazwa_usługi" | findstr STATE

na przykład:

sc query "wuauserv" | findstr STATE

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

Odpowiedział 01/12/2016 o 03:08
źródło użytkownik

głosy
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
Odpowiedział 05/12/2016 o 16:53
źródło użytkownik

głosy
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
Odpowiedział 23/12/2016 o 00:42
źródło użytkownik

głosy
0

Użyj Cygwin Bash z:

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

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

Odpowiedział 18/12/2017 o 06:02
źródło użytkownik

głosy
0

Zauważyłem nikt nie wspomniał użycie wyrażeń regularnych przy użyciu find/ findstr-na odpowiedzi. To może być problematyczne dla podobnie nazwanych usług.

Powiedzmy, że masz dwie usługi, CDPUserSvcorazCDPUserSvc_54530

Jeśli używasz większość find/ findstropartych o odpowiedzi tutaj tak daleko, dostaniesz fałszywie dodatnich dla CDPUserSvczapytań kiedy tylko CDPUserSvc_54530jest uruchomiony.

/rI /cprzełączniki findstrmogą 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 CDPUserSvcserwisu i zignorowaćCDPUserSvc_54530

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

Odpowiedział 13/02/2018 o 03:45
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more