2013-06-25 29 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 
相關問題