web-dev-qa-db-fra.com

Comment tester si un service est en cours d'exécution à partir de la ligne de commande

Je voudrais pouvoir demander si un service s'exécute à partir d'un fichier batch Windows. Je sais que je peux utiliser:

requête sc "ServiceName"

mais, cela vide du texte. Ce que je veux vraiment, c’est qu’elle définisse la variable d’environnement errorlevel afin que je puisse agir à ce sujet.

Connaissez-vous un moyen simple de le faire?

MISE À JOUR
Merci pour les réponses fournies jusqu'ici. Je crains que les solutions d'analyse du texte ne fonctionnent pas sur des systèmes d'exploitation autres que l'anglais. Est-ce que quelqu'un connaît un moyen de contourner cela, ou vais-je devoir mordre la balle et écrire un programme sur console pour y arriver correctement.

48
Scott Langham
sc query "ServiceName" | find "RUNNING"
70
Igal Serban

Revenons à la vieille école de programmation par lots sur Windows

net start | find "Service Name"

Cela fonctionnera partout ...

16
Shahin

si cela ne vous dérange pas de combiner la commande net avec grep, vous pouvez utiliser le script suivant.

@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
8
joerg

Vous pouvez utiliser wmic avec l'option / 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
)
6
NicJ

Pensant un peu en dehors de la boîte ici, je vais proposer que Powershell soit une réponse sur les ordinateurs XP/2003 les plus récents et certainement sur Vista/2008 et plus récent (au lieu de .bat/.cmd). Toute personne qui a un peu de Perl dans son arrière-plan devrait se sentir assez rapidement à la maison.


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

Si vous avez un investissement important dans le traitement par lots, vous pouvez également exécuter le script PS en une ligne, en renvoyant un code de sortie.


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

ECHO.%ERRORLEVEL%

Exécuter en tant que one-liner contourne également la stratégie de signature de code PS par défaut aux dépens de la confusion. Pour placer les commandes PS dans un fichier .ps1 et le lancer comme powershell myCode.ps1 vous constaterez peut-être que la signature de vos scripts powershell est nécessaire pour les exécuter de manière automatisée (dépend de votre environnement). Voir http://www.hanselman.com/blog/SigningPowerShellScripts.aspx pour plus de détails.

3
JGurtz

Je voudrais suggerer WMIC Service WHERE "Name = 'SericeName'" GET Started

ou WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId _ (ProcessId sera à zéro si le service n'est pas démarré)

Vous pouvez définir le niveau d'erreur selon que le premier retourne "TRUE" ou que le dernier retourne une valeur différente de zéro

3
Mark Sowul
requête sc "nom_service" | findstr ÉTAT

par exemple:

sc requête "wuauserv" | findstr ÉTAT

Pour signaler ce que fait le service de mise à jour Windows, exécuter/suspendre, etc.
Ceci s’applique également à Windows 10. Merci plus tard.

2
Quack

Essayer

sc query state= all 

pour une liste de services et s'ils fonctionnent ou non.

2
Galwegian
@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
1
Muhammad Imron

J'ai trouvé ceci:

  sc query "ServiceName" | findstr RUNNING  

semble faire à peu près la bonne chose. Mais, je crains que cela ne soit pas assez généralisé pour fonctionner sur des systèmes d'exploitation non anglais.

1
Scott Langham
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
Luis Ramos

Juste pour ajouter à la liste si vous utilisez Powershell.

sc.exe query "ServiceName" | findstr RUNNING

La commande ci-dessous ne fonctionne pas car sc est un alias de Set-Content dans Powershell.

sc query "ServiceName" | findstr RUNNING

find ne fonctionne pas non plus sur Powershell pour une raison inconnue de moi.

sc.exe query "ServiceName" | find RUNNING
0
Chris Voon

J'ai remarqué que personne ne mentionnait l'utilisation d'expressions régulières lors de l'utilisation de Réponses find/findstr. Cela peut être problématique pour des services de même nom.

Disons que vous avez deux services, CDPUserSvc et CDPUserSvc_54530

Si vous utilisez jusqu'à présent la plupart des réponses fournies par find/findstr, vous obtiendrez des résultats faussement positifs pour les requêtes CDPUserSvc uniquement lorsque CDPUserSvc_54530 est en cours d'exécution.

Le /r et /c Les commutateurs pour findstr peuvent nous aider à gérer ce cas d’utilisation, ainsi que le caractère spécial indiquant la fin de la ligne, $

Cette requête ne vérifiera que l'exécution du service CDPUserSvc et ignorera CDPUserSvc_54530

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

0
kayleeFrye_onDeck

Utilisez Cygwin Bash avec:

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

(Assurez-vous que vous avez sc.exe dans votre chemin.)

0
not2qubit