2009-12-16 25 views
10

Come verificherebbe se un servizio WIN32 esiste e, in caso affermativo, fare qualche operazione?Se il servizio esiste Condizione

+0

Che servizio su quale sistema? Si prega di fornire più contesti. –

+0

Sarà un servizio locale, diciamo chiamato ABC. Devo riavviare il servizio se esiste come parte di un evento post build in Visual Studio. Gli eventi VS post build sono essenzialmente comandi batch/dos (??). – Burt

risposta

10

Nella parte superiore della mia testa, è possibile verificare se un servizio specifico è in esecuzione, come menzionato da bmargulies, utilizzando il comando "net", piping il risultato in "find". Qualcosa come il seguente dovrebbe verificare se un servizio era in esecuzione, e in tal caso fermarlo. È quindi possibile avviarlo senza preoccuparsi se era già in esecuzione o meno:

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

Se stai usando findstr di fare una ricerca, come alcune delle altre risposte hanno suggerito, allora si sarebbe verificare la presenza di ERRORLEVEL uguale a 0 (zero) ... se è allora avete trovato la stringa che stai cercando:

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

Essenzialmente più comandi DOS fisserà ERRORLEVEL, che consente di controllare se qualcosa come un ritrovamento è riuscita.

18

Non è possibile farlo in DOS, poiché DOS non è Windows e non ha nemmeno il concetto di "servizio".

In un batch file di Windows è possibile utilizzare il comando sc per trovare servizi:

sc query | findstr SERVICE_NAME 

Ciò enumerare tutti i servizi e cedere loro rispettivi nomi.

È possibile cercare un determinato servizio con

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

Ricordate che questa ricerca è case-sensitive. È possibile aggiungere l'opzione /I a findstr per evitare ciò.

1

Come sull'utilizzo WMIC:

Primo elenco di tutti i processi, quindi grep vostro nome del processo. Nessun risultato verrà stampato se non esiste.

wmic service |findstr "ProcessName" 

Esempio:

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

come funzionerebbe in una dichiarazione if? – Burt

+0

@Burt: se la dichiarazione in quale lingua? batch, vbscript, C# o anche perl? Certamente sarà molto più semplice installare wc (parte di coreutils in gnu32), c:> wmic service | findstr "Cerca" | wc -l, quindi scrivere del codice per afferrare quel numero per determinare. –

4

Basta un addendum alla risposta accettata. Se stai cercando di fare altre cose oltre al semplice riavvio del servizio, e stai cercando di vedere se il servizio è installato.

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

In questo caso, lo stato = tutto è importante in quanto se il servizio non è avviato, sarà interpretato come non installato, che sono due cose separate.

+0

Come già detto, questo dovrebbe essere: 'se non ERRORLEVEL 1 (** My Operation **)' – bstoney

3

Non dovrebbe essere testato con successo: "if (not) errorlevel 1" ??

Nella shell di Windows "se errorlevel #" significa che il errorlevel è # o superiore, quindi "se errorlevel 0" è sempre vero.

+0

che è una risposta a "come faccio a testare se l'esecuzione di un eseguibile ha funzionato" ma non ha nulla a che fare con vedere se un servizio è installato o in esecuzione –

+0

Ho saputo, ma non ho avuto diritti di scrivere commenti in questo momento. – user2956477

2

sto usando il codice qui sotto:

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

Se MyService non viene trovato,% ERRORLEVEL% sarà fissato a 1 da FIND, altrimenti rimarrà a 0.L'istruzione IF% ERRORLEVEL% EQU 0 ti consente di testare quest'ultimo caso e procedere con un'operazione sul tuo servizio.

IF ERRORLEVEL 0 NET STOP MyService 

non funzionerà, perché esegue il comando se% ERRORLEVEL% è maggiore o uguale a zero.

In un post evento di compilazione di Visual Studio, si deve porre:

EXIT 0 

alla fine perché VS rileverà che% ERRORLEVEL% = 0 e si prenderà in considerazione che il post evento di compilazione non è riuscita . Usalo con attenzione perché questo nasconderà tutti gli errori nella sequenza dei comandi.

Con questo trucco, è possibile ignorare l'errore e utilizzare questo nel tuo post evento generazione per riavviare il servizio:

NET STOP MyService 
NET START MyService 
EXIT 0