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

后端 未结 11 1560
广开言路
广开言路 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:44

    I improved the script of Eric Falsken and revised by Gerorge Perkins.

    Changes:

    • now it is not only a restart script. The script can start, stop and restart a local or remote service;
    • removed logging (if you want this, you can use it simply by launching SCRIPT_NAME.bat > logfile.txt);
    • sparse optimizations.

      @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
      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 "TTL=" >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...
          SLEEP %DEFAULT_DELAY%
          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
      

提交回复
热议问题