views:

436

answers:

3

Hi folks,
I want to write a batch file that performs the following operation:

  • Check if a Service is running
    ** If is it running, quit the batch
    ** If it is not running, start the service

The code samples I googled so far turned out not to be working, so I decided not to post them.

Starting a service is done by:

net start "SERVICENAME"

1) How can I check if a service is running, and how to make an if statement in a batchfile?
2) I'm a bit confused. What is the argument I have to pass onto the net start? The service name or its display name?

+2  A: 

That should do it:

FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING"
IF ERRORLEVEL 1 SC start %%a)
Nick Brooks
+2  A: 

You can use the following command to see if a service is running or not:

sc query [ServiceName] | findstr /i "STATE"

When I run it for my NOD32 Antivirus, I get:

STATE                       : 4 RUNNING

If it was stopped, I would get:

STATE                       : 1 STOPPED

You can use this in a variable to then determine whether you use NET START or not.

The service name should be the service name, not the display name.

LittleBobbyTables
Thanks for your help, while trying to integrate what you posted, I much increas my batch skills ;)
citronas
+5  A: 

To check a service's state, use sc query <SERVICE_NAME>. For if blocks in batch files, check the documentation.

The following code will check the status of the service MyServiceName and start it if it is not running (the if block will be executed if the service is not running):

for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName" ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   REM Put your code you want to execute here
   REM For example, the following line
   net start "MyServiceName"
  )
)

Explanation of what it does:

  1. Queries the properties of the service.
  2. Looks for the line containing the text "STATE"
  3. Tokenizes that line, and pulls out the 3rd token, which is the one containing the state of the service.
  4. Tests the resulting state against the string "RUNNING"

As for your second question, the argument you will want to pass to net start is the service name, not the display name.

lc
Awesome. Thanks for your effort. Unfortunately it does not work? Maybe I'm too stupid for this. I replaced "MyServiceName" with "SCardSvr" (escaped) as a test, put everything into a batchfile, executed it, but the service does not start up. Even if I replace net start with something else, like printing into a file, it will not be executed. Would you mind taking a second look please? =)
citronas
Oops I had some extra stuff in the first line there...Try this. And if it doesn't work, what happens when you run `sc query "SCardSvr"` from a command line?
lc
Do you have "SCardSvr" in quotes? I don't believe it should be,
LittleBobbyTables
@LittleBobbyTables: You are right. Without quotes made it work. I'm so stupid :-| Thanks for your help
citronas