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