How to test whether a service is running from the command line

后端 未结 14 1600
天涯浪人
天涯浪人 2020-12-12 18:59

I would like to be able to query whether or not a service is running from a windows batch file. I know I can use:

sc query \"ServiceName\"

相关标签:
14条回答
  • if you don't mind to combine the net command with grep you can use the following script.

    @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
    
    0 讨论(0)
  • 2020-12-12 19:28

    I noticed no one mentioned the use of regular expressions when using find/findstr-based Answers. That can be problematic for similarly named services.

    Lets say you have two services, CDPUserSvc and CDPUserSvc_54530

    If you use most of the find/findstr-based Answers here so far, you'll get false-positives for CDPUserSvc queries when only CDPUserSvc_54530 is running.

    The /r and /c switches for findstr can help us handle that use-case, as well as the special character that indicates the end of the line, $

    This query will only verify the running of the CDPUserSvc service and ignore CDPUserSvc_54530

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

    0 讨论(0)
  • 2020-12-12 19:29
    sc query "ServiceName" | find "RUNNING"
    
    0 讨论(0)
  • 2020-12-12 19:31

    Thinking a little bit outside the box here I'm going to propose that powershell may be an answer on up-to-date XP/2003 machines and certainly on Vista/2008 and newer (instead of .bat/.cmd). Anyone who has some Perl in their background should feel at-home pretty quickly.

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

    Another way, if you have significant investment in batch is to run the PS script as a one-liner, returning an exit code.

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

    Running as a one-liner also gets around the default PS code signing policy at the expense of messiness. To put the PS commands in a .ps1 file and run like powershell myCode.ps1 you may find signing your powershell scripts is neccessary to run them in an automated way (depends on your environment). See http://www.hanselman.com/blog/SigningPowerShellScripts.aspx for details

    0 讨论(0)
  • 2020-12-12 19:35
    @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
    
    0 讨论(0)
  • 2020-12-12 19:35
    sc query "servicename" | findstr STATE

    for example:

    sc query "wuauserv" | findstr STATE

    To report what the Windows update service is doing, running/paused etc.
    This is also for Windows 10. Thank me later.

    0 讨论(0)
提交回复
热议问题