2009-12-16 6 views
10

Exists Comment voulez-vous vérifier si un service WIN32 existe et, le cas échéant, faire une opération?Si le service Condition

+0

Quel service sur ce système? S'il vous plaît fournir plus de contextes. –

+0

Ce sera un service local disons nommé ABC. J'ai besoin de redémarrer le service s'il existe dans le cadre d'un événement post-construction en studio visuel. Les événements VS post build sont essentiellement des commandes batch/dos (??). – Burt

Répondre

10

Du haut de ma tête, vous pouvez vérifier si un service est en cours d'exécution spécifique, comme mentionné par bmargulies, en utilisant la commande « net », la tuyauterie du résultat dans « trouver ». Quelque chose comme ce qui suit vérifierait si un service était en cours d'exécution, et si c'est le cas, arrêtez-le. Vous pouvez alors le démarrer sans se soucier si elle était déjà en cours d'exécution ou non:

net start | find "SomeService" 
if ERRORLEVEL 1 net stop "SomeService" 
net start "SomeService" 

Si vous utilisez findstr pour faire une recherche, comme certains des autres réponses ont suggéré, alors vous vérifier ERRORLEVEL égale à 0 (zéro) ... si elle est alors vous avez trouvé la chaîne que vous cherchez:

net start | findstr "SomeService" 
if ERRORLEVEL 0 net stop "SomeService" 
net start "SomeService" 

Essentiellement la plupart des commandes DOS mis ERRORLEVEL, vous permettant de vérifier si quelque chose comme une trouvaille a réussi.

18

Vous ne pouvez pas le faire dans le DOS, comme DOS n'est pas Windows et ne même pas le concept d'un « service ».

Dans un fichier batch Windows, vous pouvez utiliser la commande sc pour trouver des services:

sc query | findstr SERVICE_NAME 

Cela énumérer tous les services et donner leurs noms respectifs.

Vous pouvez rechercher un service avec

sc query | findstr /C:"SERVICE_NAME: myservice" 

Rappelez-vous que cette recherche est sensible à la casse. Vous pouvez ajouter le commutateur /I-findstr pour éviter cela.

1

Comment l'utilisation WMIC:

La première liste de tous les processus, puis grep votre nom de processus. Aucun résultat ne sera imprimé s'il n'existe pas.

wmic service |findstr "ProcessName" 

Exemple:

C:\>wmic service |findstr "Search" 
FALSE  TRUE  Windows Search 
+0

comment cela fonctionnerait-il dans une instruction if? – Burt

+0

@Burt: si déclaration dans quelle langue? batch, vbscript, C# ou même perl? Certes, il sera beaucoup plus facile si vous installez wc (partie de coreutils dans gnu32), vous ferez c:> service wmic | findstr "Recherche" | wc -l, puis écrire du code pour saisir ce nombre à déterminer. –

4

Juste un additif à la réponse acceptée. Si vous cherchez à faire autre chose que de simplement redémarrer le service, et que vous cherchez à voir si le service est installé.

sc query state= all | findstr /C:"SERVICE_NAME: MyService" 
if ERRORLEVEL 0 (**My Operation**) 

Dans ce cas, l'état = tout est important car si le service ne démarre pas, il sera interprété comme ne est pas installé, qui sont deux choses distinctes.

+0

Comme mentionné, cela devrait être: 'si pas ERRORLEVEL 1 (** Mon Opération **)' – bstoney

3

Ne doit pas être testé succès: "si (non) errorlevel 1" ??

dans le shell Windows "if errorlevel #" signifie que le errorlevel est # ou plus, donc "si errorlevel 0" est alway vrai.

+0

qui est une réponse à "comment puis-je tester si l'exécution d'un exécutable a fonctionné" mais cela n'a rien à voir avec voir si un service est installé ou fonctionne –

+0

Je sais, mais je n'avais aucun droit d'écrire des commentaires pour le moment. – user2956477

2

J'utilise le code ci-dessous:

SC QUERY | FIND "SERVICE_NAME: MyService" 
IF %ERRORLEVEL% EQU 0 NET STOP MyService 

Si MyService ne se trouve pas,% ERRORLEVEL% sera fixé à 1 par FIND, sinon il reste à 0.L'instruction IF% ERRORLEVEL% EQU 0 vous permet de tester ce dernier cas et de poursuivre une opération sur votre service.

IF ERRORLEVEL 0 NET STOP MyService 

ne fonctionnera pas, car il exécute la commande si% ERRORLEVEL% est supérieur ou égal à zéro.

Dans un événement post construction Visual Studio, vous devez mettre:

EXIT 0 

à la fin, car VS détecte que% ERRORLEVEL% = 0 et il considérer que l'événement post construction a échoué . Utilisez ceci avec précaution car cela masquera toutes les erreurs dans votre séquence de commandes.

Avec cette astuce, vous pouvez ignorer l'erreur et l'utiliser dans votre événement post de construction pour redémarrer votre service:

NET STOP MyService 
NET START MyService 
EXIT 0 
Questions connexes