2013-06-25 16 views

回答

9
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

如果试图拿出一个小脚本,它利用了SC -command,这似乎也尽管一些局限性的(我无法测试它):

@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 -sections喜欢的东西:

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

'sc query state = all'(等号后的空格是importart)将获得所有服务。 – mojo

+0

好吧,我明白了,thx。然而,当你寻找一个特定的名字时,'SC'无论如何都会返回'STATE = STOPPED',所以你可能会测试''%state%“==”STOPPED“'。 – marsze

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 
相关问题