如何通过批处理文件检查服务是否正在运行,如果服务未运行则停止服务?

时间:2013-06-25 13:02:26

标签: if-statement service batch-file

我想要一个批处理文件来检查服务" MyServiceName"在跑。如果服务正在运行,我希望批处理文件禁用它,然后显示一条消息。如果它没有运行,并且被禁用,我希望批处理文件显示一条消息,然后退出。谢谢你的帮助。

3 个答案:

答案 0 :(得分:10)

sc query MyServiceName| find "RUNNING" >nul 2>&1 && echo service is runnung
sc query MyServiceName| find "RUNNING" >nul 2>&1 || echo service is not runnung

停止服务:

net stop MyServiceName

答案 1 :(得分:2)

如果尝试提出一个使用SC命令的小脚本,但这似乎有一些限制(我无法测试):

@echo off
setlocal enabledelayedexpansion
:: Change this to your service name
set service=MyServiceName
:: Get state of service ("RUNNING"?)
for /f "tokens=1,3 delims=: " %%a in ('sc query %service%') do (
  if "%%a"=="STATE" set state=%%b
)
:: Get start type of service ("AUTO_START" or "DEMAND_START")
for /f "tokens=1,3 delims=: " %%a in ('sc qc %service%') do (
  if "%%a"=="START_TYPE" set start=%%b
)
:: If running: stop, disable and print message
if "%state%"=="RUNNING" (
  sc stop %service%
  sc config %service% start= disabled
  echo Service "%service%" was stopped and disabled.
  exit /b
)
:: If not running and start-type is manual, print message
if "%start%"=="DEMAND_START" (
  echo Start type of service %service% is manual.
  exit /b
)
:: If start=="" assume Service was not found, ergo is disabled(?)
if "%state%"=="" (
  echo Service "%service%" could not be found, it might be disabled.
  exit /b
)

我不知道这是否给出了你想要的行为。似乎SC没有列出被禁用的服务。但是,如果它被禁用,你不想做任何事情,如果找不到服务,我的代码只会打印一条消息。

但是,您可以将我的代码用作框架/工具箱。

修改

鉴于npocmaka的答案,您可以将for - 部分更改为:

sc query %service%| find "RUNNING" >nul 2>&1 && set running=true

答案 2 :(得分:1)

此脚本将服务名称作为第一个(也是唯一的)参数,或者您可以将其硬编码到SVC_NAME分配中。 sc命令的输出被丢弃。我不知道你是否真的想看到它。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

SET SVC_NAME=MyServiceName
IF NOT "%~1"=="" SET "SVC_NAME=%~1"

SET SVC_STARTUP=
FOR /F "skip=1" %%s IN ('wmic path Win32_Service where Name^="%SVC_NAME%" get StartMode') DO (
    IF "!SVC_STARTUP!"=="" SET "SVC_STARTUP=%%~s"
)

CALL :"%SVC_STARTUP%" "%SVC_NAME%"
CALL :StopService "%SVC_NAME%"
GOTO :EOF

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:"Boot"
:"System"
:"Auto"
:"Manual"
@ECHO Disabling service '%~1'.
sc.exe config "%~1" start= disabled > NUL
IF NOT ERRORLEVEL 1 @ECHO Service '%~1' disabled.
EXIT /B

:"Disabled"
@ECHO Service '%~1' already disabled.
EXIT /B


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:StopService
SETLOCAL
SET SVC_STATE=
FOR /F "skip=1" %%s IN ('wmic path Win32_Service where Name^="%~1" get State') DO (
   IF "!SVC_STATE!"=="" SET "SVC_STATE=%%~s"
)
CALL :"%SVC_STATE%" "%~1"
EXIT /B


:"Running"
:"Start Pending"
:"Continue Pending"
:"Pause Pending"
:"Paused"
:"Unknown"
@ECHO Stopping service '%~1'.
sc.exe stop "%~1" > NUL
IF NOT ERRORLEVEL 1 @ECHO Service '%~1' stopped.

EXIT /B

:"Stop Pending"
:"Stopped"
@ECHO Service '%~1' is already stopping/stopped.
EXIT /B