2008-12-09 20 views
39

से चल रही है या नहीं, मैं यह पूछने में सक्षम होना चाहता हूं कि विंडोज बैच फ़ाइल से कोई सेवा चल रही है या नहीं। मैं जानता हूँ कि मैं उपयोग कर सकते हैं:यह जांचने के लिए कि कोई सेवा कमांड लाइन

अनुसूचित जाति क्वेरी "ServiceName"

लेकिन, इस कुछ पाठ बाहर उदासीनता। मैं वास्तव में क्या चाहता हूं कि errorlevel पर्यावरण चर सेट करें ताकि मैं उस पर कार्रवाई कर सकूं।

क्या आप एक सरल तरीका जानते हैं कि मैं यह कर सकता हूं?

अद्यतन
अभी तक उत्तर के लिए धन्यवाद। मैं ऐसे समाधानों से चिंतित हूं जो पाठ को पार्स कर सकते हैं, गैर अंग्रेजी ऑपरेटिंग सिस्टम पर काम नहीं कर सकते हैं। क्या कोई इस के आसपास एक रास्ता जानता है, या मुझे यह अधिकार प्राप्त करने के लिए बुलेट काटने और कंसोल प्रोग्राम लिखना होगा।

+0

मैं सिर्फ एक चीन लोकेल चीनी भाषा विंडोज 7 लैपटॉप पर परीक्षण किया है, "अनुसूचित जाति क्वेरी ..." कमांड उत्पादन अभी भी अंग्रेजी। – wangf

+0

सेवा स्थिति प्राप्त करने के लिए जो स्क्रिप्ट द्वारा पार्स करना आसान होगा, इससे कोई फर्क नहीं पड़ता कि ओएस भाषा का उपयोग किस प्रकार किया जाता है, मैंने 'WMIC सेवा कहां है' नाम = 'SericeName' 'प्रारंभ/प्रारूप: सूची' प्राप्त किया है। यह 'राज्य = रनिंग 'का उत्पादन करता है - regexp द्वारा हमेशा पार्स करना और हमेशा अंग्रेजी में। –

उत्तर

63
sc query "ServiceName" | find "RUNNING" 
+1

खोज काम नहीं कर रहा है। findstr काम करता है। –

+0

@imkheong, किस ओएस "खोज" पर काम नहीं कर रहा है? यह win7 पर woks ... –

+0

@ShaiAlon, यह शक्तियों था कि यह काम नहीं किया। यह सामान्य कमांड प्रॉम्प्ट (cmd.exe) पर काम करता था। –

1

सेवाओं की एक सूची के लिए

sc query state= all 

की कोशिश करो और वे चल रहे हैं या नहीं।

8

यदि आप grep के साथ नेट कमांड को गठबंधन करने के लिए कोई फर्क नहीं पड़ता है तो आप निम्न स्क्रिप्ट का उपयोग कर सकते हैं।

@echo off 
net start | grep -x "Service" 
if %ERRORLEVEL% == 2 goto trouble 
if %ERRORLEVEL% == 1 goto stopped 
if %ERRORLEVEL% == 0 goto started 
echo unknown status 
goto end 
:trouble 
echo trouble 
goto end 
:started 
echo started 
goto end 
:stopped 
echo stopped 
goto end 
:end 
+0

मुझे लगता है कि मेरे सिस्टम पर grep नहीं है। क्या आपने इसे कहीं से डाउनलोड किया है, यदि हां, तो कहाँ? –

+0

http://unxutils.sourceforge.net/ –

+2

मैंने इस तरह कुछ उपयोग किया है, लेकिन 'grep' के बजाय 'ढूंढ' के साथ, क्योंकि मैं किसी और चीज को स्थापित करने पर भरोसा नहीं करना चाहता हूं। –

1

मैं इस पाया है:

sc query "ServiceName" | findstr RUNNING 

मोटे तौर पर सही काम करने लगता है। लेकिन, मुझे चिंता है कि गैर-अंग्रेजी ऑपरेटिंग सिस्टम पर काम करने के लिए पर्याप्त सामान्यीकृत नहीं है।

+0

यदि आपको वास्तव में i18n करने की आवश्यकता है, तो आपको एक ऐप लिखना चाहिए जो त्रुटि और त्रुटि को सेट करता है। – hometoast

4

आप /locale विकल्प

call wmic /locale:ms_409 service where (name="wsearch") get state /value | findstr State=Running 
if %ErrorLevel% EQU 0 (
    echo Running 
) else (
    echo Not running 
) 
2

बॉक्स यहाँ मुझे लगता है कि powershell प्रस्ताव करने के लिए एक जवाब हो सकता है जा रहा हूँ पर अप-टू-डेट XP/2003 मशीनों और बाहर एक छोटा सा सोच के साथ wmic इस्तेमाल कर सकते हैं निश्चित रूप से Vista/2008 और नए (बजाय .bat/.cmd) पर। कोई भी जिसके पास अपनी पृष्ठभूमि में कुछ पर्ल है, उसे घर पर बहुत जल्दी महसूस करना चाहिए।


$serviceName = "ServiceName"; 
$serviceStatus = (get-service "$serviceName").Status; 

if ($serviceStatus -eq "Running") { 
    echo "Service is Running"; 
} 
else { 
    #Could be Stopped, Stopping, Paused, or even Starting... 
    echo "Service is $serviceStatus"; 
} 

एक और तरीका है, अगर आप बैच में महत्वपूर्ण निवेश है, एक एक लाइनर के रूप में पी एस स्क्रिप्ट चलाने के लिए एक निकास कोड लौटा रहा है।


@ECHO off 
SET PS=powershell -nologo -command 
%PS% "& {if((get-service SvcName).Status -eq 'Running'){exit 1}}" 

ECHO.%ERRORLEVEL% 

एक लाइनर के रूप में चलने से भी गड़बड़ी की कीमत पर डिफ़ॉल्ट पीएस कोड हस्ताक्षर नीति के आसपास हो जाता है। पीएस कमांड को .ps1 फ़ाइल में डालने और powershell myCode.ps1 जैसे चलाने के लिए आप अपने पावरहेल स्क्रिप्ट पर हस्ताक्षर कर सकते हैं स्वचालित रूप से उन्हें चलाने के लिए आवश्यक है (आपके पर्यावरण पर निर्भर करता है)। विवरण

के लिए http://www.hanselman.com/blog/SigningPowerShellScripts.aspx
11

देखें की खिड़कियों

net start | find "Service Name" 

यह हर जगह काम करेंगे पर बैच कार्यक्रमों की की पुराने स्कूल पर वापस चलते हैं ...

+0

और आप बाद में% errorlevel% की जांच कर सकते हैं। –

+0

_errorlevel_ 1 सेवा है जब सेवा मौजूद है या नहीं। तो मैं "ढूंढ" का उपयोग नहीं कर सकता। (विन 7 प्रो 64 बिट) –

2

मेरा सुझाव है WMIC Service WHERE "Name = 'SericeName'" GET Started

या WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId (ProcessID शून्य हो सकता है अगर सेवा प्रारंभ नहीं किया गया है)

आप के आधार पर त्रुटि स्तर सेट कर सकते हैं कि क्या पूर्व रिटर्न "सही" या बाद रिटर्न nonzero

+0

यह वास्तव में सेवा राज्य प्राप्त करने का एकमात्र तरीका है जो हमेशा अंग्रेजी में मूल्य लौटाएगा चाहे ओएस भाषा क्या हो। –

0

यदि आप पावरहेल का उपयोग कर रहे हैं तो बस सूची में जोड़ने के लिए।

sc.exe query "ServiceName" | findstr RUNNING 

क्योंकि sc एक उपनाम Powershell के भीतर सेट-सामग्री के लिए है आदेश नीचे काम नहीं करता।

sc query "ServiceName" | findstr RUNNING 

find भी किसी कारण मेरे लिए अज्ञात के लिए Powershell पर काम नहीं करता।

sc.exe query "ServiceName" | find RUNNING 
2
sc query "servicename" | findstr STATE
उदाहरण के लिए

:

sc query "wuauserv" | findstr STATE

रिपोर्ट करने के लिए क्या विंडोज अद्यतन सेवा कर रही है, चल रहा है/आदि रुका हुआ
यह भी विंडोज 10 के लिए मुझे बाद में धन्यवाद है।

0
SERVICO.BAT 
@echo off 
echo Servico: %1 
if "%1"=="" goto erro 
sc query %1 | findstr RUNNING 
if %ERRORLEVEL% == 2 goto trouble 
if %ERRORLEVEL% == 1 goto stopped 
if %ERRORLEVEL% == 0 goto started 
echo unknown status 
goto end 
:trouble 
echo trouble 
goto end 
:started 
echo started 
goto end 
:stopped 
echo stopped 
goto end 
:erro 
echo sintaxe: servico NOMESERVICO 
goto end 

:end 
0
@ECHO OFF 
REM testing at cmd : sc query "MSSQLSERVER" | findstr RUNNING 
REM "MSSQLSERVER" is the name of Service for sample 
sc query "MSSQLSERVER" %1 | findstr RUNNING 
if %ERRORLEVEL% == 2 goto trouble 
if %ERRORLEVEL% == 1 goto stopped 
if %ERRORLEVEL% == 0 goto started 
echo unknown status 
goto end 
:trouble 
echo Oh noooo.. trouble mas bro 
goto end 
:started 
echo "SQL Server (MSSQLSERVER)" is started 
goto end 
:stopped 
echo "SQL Server (MSSQLSERVER)" is stopped 
echo Starting service 
net start "MSSQLSERVER" 
goto end 
:erro 
echo Error please check your command.. mas bro 
goto end 

:end 
+0

इस मुद्दे के जवाब के साथ कुछ स्पष्टीकरण जोड़ें कि इस मुद्दे को वर्तमान समस्या को ठीक करने में ओपी की मदद कैसे करें –

0

उपयोग Cygwin बैश के साथ:

sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!" 

(सुनिश्चित करें कि आप अपने पथ में sc.exe किया हुआ है।)

0

मैंने देखा जब find का उपयोग कर कोई भी नियमित अभिव्यक्तियों का उपयोग उल्लेख किया/findstr-आधारित उत्तर। यह समान नामित सेवाओं के लिए समस्याग्रस्त हो सकता है।

कहते हैं कि तुम दोनों सेवाओं, CDPUserSvc और CDPUserSvc_54530

तुम यहाँ अब तक find/findstr आधारित जवाब के सबसे का उपयोग करते हैं, तो आप CDPUserSvc प्रश्नों के लिए झूठी सकारात्मक मिल जाएगा जब केवल CDPUserSvc_54530 चल रहा है है की सुविधा देता है।

/r और findstr के लिए /c स्विच मदद कर सकते हैं हमें उस यूज-केस, साथ ही विशेष वर्ण कि पंक्ति के अंत इंगित करता है संभाल, $

इस क्वेरी केवल CDPUserSvc सेवा के संचालन की पुष्टि करेगा और उपेक्षा CDPUserSvc_54530

sc query|findstr /r /c:"CDPUserSvc$"

संबंधित मुद्दे