views:

19166

answers:

12

How can I script a bat or cmd to stop and start a service reliably with error checking (or let me know that it wasn't successful for whatever reason)?

+1  A: 

Using the return codes from "net start" and "net stop" seems like the best method to me. Try a look at this

ZombieSheep
+23  A: 
net start [serviceName]

and

net stop [serviceName]

tell you whether they have succeeded or failed pretty clearly. For example

U:\>net stop alerter
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

If running from a batch file, you have access to the ERRORLEVEL of the return code. 0 indicates success. Anything higher indicates failure.

As a bat file, error.bat:

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause

The output looks like this:

U:\>error.bat
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

There was a problem
Press any key to continue . . .

Return Codes

 - 0 = Success
 - 1 = Not Supported
 - 2 = Access Denied
 - 3 = Dependent Services Running
 - 4 = Invalid Service Control
 - 5 = Service Cannot Accept Control
 - 6 = Service Not Active
 - 7 = Service Request Timeout
 - 8 = Unknown Failure
 - 9 = Path Not Found
 - 10 = Service Already Running
 - 11 = Service Database Locked
 - 12 = Service Dependency Deleted
 - 13 = Service Dependency Failure
 - 14 = Service Disabled
 - 15 = Service Logon Failure
 - 16 = Service Marked For Deletion
 - 17 = Service No Thread
 - 18 = Status Circular Dependency
 - 19 = Status Duplicate Name
 - 20 = Status Invalid Name
 - 21 = Status Invalid Parameter 
 - 22 = Status Invalid Service Account
 - 23 = Status Service Exists
 - 24 = Service Already Paused
Bill Michell
This answer is what we should see more! Nice work.
Pokus
Not all mine - the return codes came from a community edit...
Bill Michell
Well it is a good response all the same. Thanks a bunch.
Brendan Enrick
+2  A: 

You can use the NET START command and then check the ERRORLEVEL environment variable, e.g.

net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%

Disclaimer: I've written this from the top of my head, but I think it'll work.

Jonas Gulle
A: 

Can you be a little more specific? My handy-dandy edition of "Windows NT In A Nutshell" lists "net start" and "net stop" as being the means to start and stop a service from a batch file. It does not mention anything about an errorlevel or other indications of success or failure.

Onorio Catenacci
+25  A: 

use the SC (service control) command, it gives you a lot more options than just start & stop

  DESCRIPTION:
          SC is a command line program used for communicating with the
          NT Service Controller and services.
  USAGE:
      sc  [command] [service name]  ...

      The option  has the form "\\ServerName"
      Further help on commands can be obtained by typing: "sc [command]"
      Commands:
        query-----------Queries the status for a service, or
                        enumerates the status for types of services.
        queryex---------Queries the extended status for a service, or
                        enumerates the status for types of services.
        start-----------Starts a service.
        pause-----------Sends a PAUSE control request to a service.
        interrogate-----Sends an INTERROGATE control request to a service.
        continue--------Sends a CONTINUE control request to a service.
        stop------------Sends a STOP request to a service.
        config----------Changes the configuration of a service (persistant).
        description-----Changes the description of a service.
        failure---------Changes the actions taken by a service upon failure.
        qc--------------Queries the configuration information for a service.
        qdescription----Queries the description for a service.
        qfailure--------Queries the actions taken by a service upon failure.
        delete----------Deletes a service (from the registry).
        create----------Creates a service. (adds it to the registry).
        control---------Sends a control to a service.
        sdshow----------Displays a service's security descriptor.
        sdset-----------Sets a service's security descriptor.
        GetDisplayName--Gets the DisplayName for a service.
        GetKeyName------Gets the ServiceKeyName for a service.
        EnumDepend------Enumerates Service Dependencies.

      The following commands don't require a service name:
      sc   
        boot------------(ok | bad) Indicates whether the last boot should
                        be saved as the last-known-good boot configuration
        Lock------------Locks the Service Database
        QueryLock-------Queries the LockStatus for the SCManager Database
  EXAMPLE:
          sc start MyService
Ferruccio
that screen dump just won the prize! thanks, I didn't even know about 'sc'!!!
Keng
I agree that this is better than net start/stop. Note that there is an option to touch services on remote machines as well.
Outlaw Programmer
Wow--excellent answer!
Onorio Catenacci
+1  A: 

maybe this will help

http://www.ss64.com/nt/sc.html http://www.ss64.com/nt/net_service.html

+1  A: 

Maybe somewhat offtopic (since you ask for bat & cmd instruction) but:

PowerShell gives you a lot of control and feedback for doing actions like this.

GvS
still good to mention PS though.
Keng
+1  A: 

SC can do everything with services... start, stop, check, configure, and more...

Axeman
A: 

God help us....how long will it take us to get off of Batch files? Are batch files the 'tallow candles' of the computer world? Easy to make and Work well but can burn dirty.

Keng
Not until Microsoft starts shipping bash with windows.
Rob K
I'd take PowerShell over bash any day.
Joey
A: 

SC seems to set ERRORLEVEL to 0 no matter whether it succeeds or fails: the error codes you quote above are never returned. For example:

V:\logs>sc query hub [SC] EnumQueryServicesStatus:OpenService FAILED 1060:

The specified service does not exist as an installed service.

V:\logs>echo %ERRORLEVEL% 0

same goes for start/stop commands

Any idea what might be going on?

David
not sure off the top of my head but create a new question and it should get looked at quickly.
Keng
A: 

Does 'net' work with services that aren't network related?

WyrdestGeek
Yes, it is just used for services (all of them).
Keng
A: 

Does this also work on starting any .exe? "SC Start I:\Programme\TN1.0.4\TS-NOISE.exe SC Stop I:\Programme\TN1.0.4\TS-NOISE.exe" because that is what i would want...

Pvt_Pirate
no, this just controls services.
Keng