Stopping/Starting a remote Windows service and waiting for it to open/close

后端 未结 11 1512
广开言路
广开言路 2020-12-02 06:42

The top answer to this question tells me how to stop/start a remote service. Great. Now, all I need is to wait for the actual stop/start to complete. So, what I\'m looking f

11条回答
  •  抹茶落季
    2020-12-02 07:23

    I've made a minor change to the script, so that it is running under Windows 10 or similar Versions. The command "sleep" was replaced with the command "timeout".

    @ECHO off
    :: This script originally authored by Eric Falsken http://stackoverflow.com/
    :: Revised by George Perkins 10/20/2011
    :: Revised by Armando Contestabile 02/23/2015
    :: Revised by Sascha Jelinek 11/13/2020
    IF "%1"=="" GOTO Usage
    IF "%2"=="" GOTO Usage
    
    SET ACTION=%1
    SET SERVICENAME=%2
    
    IF "%3"=="" (
        SET SYSTEMNAME=%COMPUTERNAME%
    ) ELSE (
        SET SYSTEMNAME=%3
    )
    
    IF "%ACTION%" == "stop" (
        SET ACTION=STOP
    ) ELSE IF "%ACTION%" == "STOP" (
        SET ACTION=STOP
    ) ELSE IF "%ACTION%" == "start" (
        SET ACTION=START
    ) ELSE IF "%ACTION%" == "START" (
        SET ACTION=START
    ) ELSE IF "%ACTION%" == "restart" (
        SET ACTION=RESTART
    ) ELSE IF "%ACTION%" == "RESTART" (
        SET ACTION=RESTART
    ) ELSE GOTO Usage
    
    SET STATE=
    SET CURRENT_STATUS=
    SET /A DEFAULT_DELAY=5
    SET /A SLEEP_COUNT=0
    SET /A RESTARTED=0
    SET /A MAX_WAIT_PERIODS=5
    
    ECHO.
    ECHO Attempting to %ACTION% service %SERVICENAME% on computer %SYSTEMNAME%.
    
    PING -n 1 %SYSTEMNAME% | FIND "Antwort von" >nul 2>&1
    IF ERRORLEVEL 1 IF NOT ERRORLEVEL 2 (
        ECHO Failure!! Server \\%SYSTEMNAME% or service %SERVICENAME% is not accessible or is offline!
        EXIT /B 1
    )
    SC \\%SYSTEMNAME% query %SERVICENAME% | FIND "FAILED 1060" >nul 2>&1
    IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 (
        ECHO Failure! Service %SERVICENAME% is not valid!
        EXIT /B 2
    )
    SC \\%SYSTEMNAME% query %SERVICENAME% | FIND "STATE" >nul 2>&1
    IF ERRORLEVEL 1 IF NOT ERRORLEVEL 2 (
        ECHO Failure! Server \\%SYSTEMNAME% or service %SERVICENAME% is not accessible or is offline!
        EXIT /B 3
    )
    
    :Dispatch
    FOR /f "tokens=*" %%i IN ('SC \\%SYSTEMNAME% query %SERVICENAME% ^| FIND "STATE"') DO SET STATE=%%i
    
    ECHO %STATE% | FINDSTR /C:"1" >nul
    IF %ERRORLEVEL%==0 SET CURRENT_STATUS=STOPPED
    ECHO %STATE% | FINDSTR /C:"2" >nul
    IF %ERRORLEVEL%==0 SET CURRENT_STATUS=START_PENDING
    ECHO %STATE% | FINDSTR /C:"3" >nul
    IF %ERRORLEVEL%==0 SET CURRENT_STATUS=STOP_PENDING
    ECHO %STATE% | FINDSTR /C:"4" >nul
    IF %ERRORLEVEL%==0 SET CURRENT_STATUS=RUNNING
    ECHO %STATE% | FINDSTR /C:"5" >nul
    IF %ERRORLEVEL%==0 SET CURRENT_STATUS=CONTINUE_PENDING
    ECHO %STATE% | FINDSTR /C:"6" >nul
    IF %ERRORLEVEL%==0 SET CURRENT_STATUS=PAUSE_PENDING
    ECHO %STATE% | FINDSTR /C:"7" >nul
    IF %ERRORLEVEL%==0 SET CURRENT_STATUS=PAUSED
    
    ECHO Current status of service is %CURRENT_STATUS%
    
    IF NOT "%CURRENT_STATUS%"=="RUNNING" IF NOT "%CURRENT_STATUS%"=="STOPPED" IF NOT "%CURRENT_STATUS%"=="PAUSED" (
        IF "%SLEEP_COUNT%"=="%MAX_WAIT_PERIODS%" (
            ECHO Service state won't change. Script exececution is canceled.
            EXIT /B 4
        )
        ECHO Service State is changing, waiting %DEFAULT_DELAY% seconds...
        TIMEOUT /t %DEFAULT_DELAY% /NOBREAK
        SET /A SLEEP_COUNT+=1
        GOTO Dispatch
    )
    
    IF "%ACTION%"=="START" (
        IF "%CURRENT_STATUS%"=="RUNNING" (
            ECHO Service %SERVICENAME% is running.
            GOTO EndExit
        ) ELSE (
            GOTO StartService
        )
    ) ELSE IF "%ACTION%"=="RESTART" (
        IF "%CURRENT_STATUS%"=="RUNNING" (
            IF %RESTARTED%==1 (
                ECHO Service %SERVICENAME% restarted.
                GOTO EndExit
            )
            SET /A SLEEP_COUNT=0
            GOTO StopService
        ) ELSE (
            SET /A RESTARTED=1
            GOTO StartService
        )
    ) ELSE IF "%ACTION%"=="STOP" (
        IF "%CURRENT_STATUS%"=="STOPPED"  (
            ECHO Service %SERVICENAME% is stopped.
            GOTO EndExit
        ) ELSE (
            GOTO StopService
        )
    )
    
    :StartService
    ECHO Starting %SERVICENAME% on \\%SYSTEMNAME%
    SC \\%SYSTEMNAME% start %SERVICENAME% >nul 2>&1
    SET SLEEP_COUNT=0
    GOTO Dispatch
    
    :StopService
    ECHO Stopping %SERVICENAME% on \\%SYSTEMNAME%
    SC \\%SYSTEMNAME% stop %SERVICENAME% >nul 2>&1
    SET SLEEP_COUNT=0
    GOTO Dispatch
    
    :Usage
    ECHO This script can start/stop/restart a local or remote service, waiting for the service to stop/start ^(if necessary^).
    ECHO.
    ECHO Usage:
    ECHO %0 ^ ^ [SYSTEM]
    ECHO.
    ECHO If no SYSTEM is provided, the script attempts to execute on the local system.
    EXIT /B 5
    
    :EndExit
    ECHO.
    EXIT /B 0
    

提交回复
热议问题