बैच या cmd फ़ाइल के माध्यम से सेवा रोकें और शुरू करें?


288

मैं त्रुटि की जाँच के साथ मज़बूती से सेवा को रोकने और शुरू करने के लिए एक बल्ले या सीएमडी को कैसे स्क्रिप्ट कर सकता हूं (या मुझे बताएं कि यह किसी भी कारण से सफल नहीं था)?


हो सकता है कि कुछ हद तक आप (चूंकि आप बल्ले और सीएमडी अनुदेश के लिए पूछते हैं) लेकिन: पावरशेल आपको इस तरह की कार्रवाई करने के लिए बहुत नियंत्रण और प्रतिक्रिया देता है।
GvS

जवाबों:


347

SC(सेवा नियंत्रण) कमांड का उपयोग करें , यह आपको बस startऔर अधिक विकल्प देता है stop

  विवरण:
          SC एक कमांड लाइन प्रोग्राम है जिसका उपयोग संचार के लिए किया जाता है
          NT सेवा नियंत्रक और सेवाएं।
  उपयोग:
      sc <server> [कमांड] [सेवा का नाम] ...

      विकल्प <सर्वर> में "\\ ServerName" रूप है
      कमांड पर आगे की सहायता टाइपिंग द्वारा प्राप्त की जा सकती है: "sc [कमांड]"
      आदेश:
        क्वेरी ----------- किसी सेवा के लिए स्थिति को क्वेरी करता है, या
                        सेवाओं की प्रकारों के लिए स्थिति की गणना करता है।
        queryex --------- किसी सेवा के लिए विस्तारित स्थिति का प्रश्न, या
                        सेवाओं की प्रकारों के लिए स्थिति की गणना करता है।
        start ----------- एक सेवा शुरू करता है।
        रोकें ----------- सेवा के लिए एक PAUSE नियंत्रण अनुरोध भेजता है।
        पूछताछ ----- एक सेवा के लिए एक अंतर्राज्यीय नियंत्रण अनुरोध भेजता है।
        जारी रखें -------- एक सेवा के लिए एक नियंत्रण नियंत्रण अनुरोध भेजता है।
        stop ------------ एक सेवा के लिए एक STOP अनुरोध भेजता है।
        config ---------- किसी सेवा का विन्यास (लगातार) बदलता है।
        विवरण ----- किसी सेवा का विवरण बदलता है।
        विफलता --------- किसी सेवा द्वारा विफलता पर किए गए कार्यों को बदल देती है।
        qc -------------- किसी सेवा के लिए कॉन्फ़िगरेशन जानकारी को क्वेरी करता है।
        qdescription ---- एक सेवा के विवरण का वर्णन करता है।
        विफलता -------- विफलता पर एक सेवा द्वारा किए गए कार्यों को पूरा करता है।
        हटाना ---------- एक सेवा को हटाता है (रजिस्ट्री से)।
        create ---------- एक सेवा बनाता है। (इसे रजिस्ट्री में जोड़ता है)।
        नियंत्रण --------- एक सेवा के लिए एक नियंत्रण भेजता है।
        sdshow ---------- एक सेवा के सुरक्षा विवरणक को प्रदर्शित करता है।
        sdset ----------- एक सेवा का सुरक्षा डिस्क्रिप्टर सेट करता है।
        GetDisplayName - एक सेवा के लिए DisplayName हो जाता है।
        GetKeyName ------ सेवा के लिए ServiceKeyName हो जाता है।
        EnumDepend ------ Enumerates Service निर्भरताएँ।

      निम्न आदेशों को सेवा नाम की आवश्यकता नहीं है:
      sc <server> <कमांड> <विकल्प>
        बूट ------------ (ठीक है | बुरा) इंगित करता है कि क्या अंतिम बूट होना चाहिए
                        अंतिम ज्ञात-अच्छे बूट विन्यास के रूप में सहेजा जा सकता है
        लॉक ------------ सर्विस डेटाबेस को लॉक करता है
        QueryLock ------- SCManager डेटाबेस के लिए लॉकस्टैटस को क्वेरी करता है
  उदाहरण:
          sc शुरू करें MyService

1
मैं मानता हूं कि यह नेट स्टार्ट / स्टॉप से ​​बेहतर है। ध्यान दें कि रिमोट मशीनों पर भी सेवाओं को छूने का विकल्प है।
प्रोग्रामर

1
बहुत बढ़िया जवाब। लेकिन आपको 'एससी स्टार्ट सेवा' चलाने के लिए प्रशासक होने की जरूरत है। मुझे यहाँ उसके लिए एक समाधान मिला । (स्वीकृत उत्तर में समाधान शामिल है)
माइकल के।

56
SC के साथ समस्या यह है कि कमांड तुरंत पूरा होता है न कि कार्रवाई पूरी होने के बाद। यदि आप बैच फ़ाइल (स्टॉप तो स्टार्ट) के माध्यम से सेवा को पुनरारंभ करना चाहते हैं, तो स्टॉप तुरंत वापस आ जाता है, फिर प्रारंभ विफल हो जाता है क्योंकि सेवा बंद नहीं हुई है। कार्रवाई पूरी होने के बाद नेट स्टॉप / स्टार्ट रिटर्न, इसलिए यह समस्या नहीं है।
डोम

मैंने cmd को व्यवस्थापक मोड के रूप में खोला, त्रुटि हो रही है इस कमांड का सिंटैक्स है: NET STOP सेवा
सतीश सिंह

वहाँ एक तरीका है अगर सेवा ठीक से बंद कर दिया है की जाँच करने के लिए है ?? 2020 में?
आनंद वर्की फिलिप्स

212
net start [serviceName]

तथा

net stop [serviceName]

आपको बताएं कि क्या वे सफल हुए हैं या स्पष्ट रूप से असफल हुए हैं। उदाहरण के लिए

U:\>net stop alerter
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

यदि बैच फ़ाइल से चल रहा है, तो आपके पास रिटर्न कोड के ERRORLEVEL तक पहुंच है। 0 सफलता दर्शाता है। उच्चतर कुछ भी विफलता को इंगित करता है।

एक बैट फाइल के रूप में error.bat:

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause

आउटपुट इस तरह दिखता है:

U:\>error.bat
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

There was a problem
Press any key to continue . . .

कोड वापस करें

 - 0 = Success
 - 1 = Not Supported
 - 2 = Access Denied
 - 3 = Dependent Services Running
 - 4 = Invalid Service Control
 - 5 = Service Cannot Accept Control
 - 6 = Service Not Active
 - 7 = Service Request Timeout
 - 8 = Unknown Failure
 - 9 = Path Not Found
 - 10 = Service Already Running
 - 11 = Service Database Locked
 - 12 = Service Dependency Deleted
 - 13 = Service Dependency Failure
 - 14 = Service Disabled
 - 15 = Service Logon Failure
 - 16 = Service Marked For Deletion
 - 17 = Service No Thread
 - 18 = Status Circular Dependency
 - 19 = Status Duplicate Name
 - 20 = Status Invalid Name
 - 21 = Status Invalid Parameter 
 - 22 = Status Invalid Service Account
 - 23 = Status Service Exists
 - 24 = Service Already Paused

संपादित करें 20.04.2015

रिटर्न कोड:

NET कमांड डॉक्यूमेंटेड Win32_Service क्लास रिटर्न कोड (सर्विस नॉट एक्टिव, सर्विस रिक्वेस्ट टाइमआउट इत्यादि) को वापस नहीं करता है और कई त्रुटियों के लिए बस Errorlevel 2 लौटाएगा।

यहां देखें: http://ss64.com/nt/net_service.html


1
NET नहीं है , जबकि बस सेवा से संबंधित कार्यों के लिए SC है बस सेवा से संबंधित कार्यों के लिए।
वर्नट

3
यह उत्तर बेहतर है क्योंकि "नेट" कमांड ब्लॉक करता है और बैच स्क्रिप्ट को निष्पादित करने से पहले सेवा के शुरू होने या बंद होने की प्रतीक्षा करता है।
स्टीवन

चूंकि (जैसा कि एडिट कहता है) ज्यादातर समय errorlevel2 लौटा है, यहां देखें कि त्रुटि परिणाम की व्याख्या कैसे करें
हेयूड

28

आप NET START कमांड का उपयोग कर सकते हैं और फिर ERRORLEVEL पर्यावरण चर की जाँच कर सकते हैं, जैसे

net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%

अस्वीकरण: मैंने इसे अपने सिर के ऊपर से लिखा है, लेकिन मुझे लगता है कि यह काम करेगा।


8

कोड चेक करने के बजाय, यह भी काम करता है

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  

7

मैंने इसके लिए अपनी व्यक्तिगत बैच फ़ाइल बनाई है, मेरा थोड़ा अलग है, लेकिन जैसा कि आप फिट देखते हैं, संशोधित करने के लिए स्वतंत्र महसूस करते हैं। मैंने इसे थोड़ी देर पहले बनाया था क्योंकि मैं ऊब गया था और लोगों के लिए एक सरल तरीका बनाना चाहता था ताकि ऑटो को समाप्त करने, शुरू करने, रोकने या सेटिंग करने में सक्षम हो। यह BAT फाइल केवल अनुरोध करती है कि आप सेवा नाम का इनपुट करें और यह आपके लिए बाकी काम करेगा। मुझे महसूस नहीं हुआ कि वह किसी ऐसी चीज की तलाश कर रहा है जिसमें कोई त्रुटि हो, मुझे उस हिस्से को गलत समझना चाहिए। हालाँकि आमतौर पर यह लाइन के अंत में >> output.txt इनपुट करके किया जा सकता है।

% Var% उपयोगकर्ता के लिए अपनी स्वयं की सेवा को इनपुट करने में सक्षम होने का एक तरीका है, इसके बजाय हर बार जब आप किसी भिन्न सेवा को प्रारंभ / बंद करना चाहते हैं, तो हर बार बैट फ़ाइल को संशोधित करना होगा।

यदि मैं गलत हूं, तो कोई भी मुझे इस पर सही करने के लिए स्वतंत्र महसूस कर सकता है।

@echo off
set /p c= Would you like to start a service [Y/N]?
  if /I "%c%" EQU "Y" goto :1
  if /I "%c%" EQU "N" goto :2
    :1  
    set /p var= Service name: 
:2 
set /p c= Would you like to stop a service [Y/N]?
  if /I "%c%" EQU "Y" goto :3
  if /I "%c%" EQU "N" goto :4
    :3  
    set /p var1= Service name:
:4
set /p c= Would you like to disable a service [Y/N]?
  if /I "%c%" EQU "Y" goto :5
  if /I "%c%" EQU "N" goto :6
    :5  
    set /p var2= Service name:
:6 
set /p c= Would you like to set a service to auto [Y/N]?
  if /I "%c%" EQU "Y" goto :7
  if /I "%c%" EQU "N" goto :10
    :7  
    set /p var3= Service name:
:10
sc start %var%
sc stop %var1%
sc config %var2% start=disabled
sc config %var3% start=auto

1
आमतौर पर, कोड केवल उत्तरों की सराहना नहीं की जाती है। क्या आप अपने समाधान के बारे में विस्तार से बता सकते हैं या कुछ व्याख्यात्मक टिप्पणियां जोड़ सकते हैं?
एक ईयरविग

2
मैंने इसे थोड़ी देर पहले बनाया था क्योंकि मैं ऊब गया था और लोगों के लिए एक सरल तरीका बनाना चाहता था ताकि ऑटो को समाप्त करने, शुरू करने, रोकने या सेटिंग करने में सक्षम हो। यह BAT फाइल केवल अनुरोध करती है कि आप सेवा का नाम इनपुट करें और यह आपके लिए बाकी काम करेगा।
नाथनियल विल्सन

6

से रिटर्न कोड का उपयोग करना net startऔर net stopमुझे सबसे अच्छी विधि की तरह लगता है। इस पर एक नज़र डालें: नेट स्टार्ट रिटर्न कोड


2
लिंक किया गया पृष्ठ अब मौजूद नहीं है। जैसे, यह अब एक टिप्पणी का अधिक है।
नेओलिस्क

5

सिंटेक्स मुझे हमेशा मिलता है .... इसलिए ...

यहां स्पष्ट रूप से एक बैच फ़ाइल में एक पंक्ति को कैसे जोड़ा जाए जो एक दूरस्थ सेवा (किसी अन्य मशीन पर) को मार देगा यदि आप दोनों मशीनों पर व्यवस्थापक हैं, तो .bat को एक व्यवस्थापक के रूप में चलाएं, और मशीनें एक ही डोमेन पर हैं। मशीन का नाम UNC प्रारूप \ myserver के रूप में है

sc \\ip.ip.ip.ip stop p4_1

इस स्थिति में ... p4_1 सेवा नाम और प्रदर्शन नाम दोनों था, जब आप सेवा प्रबंधक में सेवा के लिए गुण देखते हैं। आपको सेवा नाम का उपयोग करना होगा।

आपकी सेवा Ops दीवाने के लिए ... अपने कारण कोड और टिप्पणी को सुनिश्चित करें! यानी '4' जो 'नियोजित' के बराबर है और टिप्पणी 'रखरखाव के लिए सर्वर रोक'

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance

1
यदि मुझे लॉग ऑन करने के लिए किसी अन्य उपयोगकर्ता आईडी और पासवर्ड का उपयोग करने की आवश्यकता है तो मैं यह कैसे करूं?
१६

1
आप CMDअन्य उपयोगकर्ता / आईडी के रूप में चलाते हैं और runas /user:Domain\UserName cmdफिर अपना पासवर्ड दर्ज करें। सीएमडी निर्दिष्ट उपयोगकर्ता खाते के रूप में चलना शुरू कर देगा।
user4317867

4

हम यह सोचना चाहते हैं कि "नेट स्टॉप" सेवा बंद हो जाएगी। अफसोस की बात है, वास्तविकता यह नहीं है कि काला और सफेद। यदि सेवा को बंद होने में लंबा समय लगता है, तो सेवा बंद होने से पहले कमांड वापस आ जाएगी। हालाँकि, आपको पता नहीं चलेगा, जब तक कि आप एररलेवल की जाँच नहीं करते।

समाधान लूप राउंड के लिए सेवा की स्थिति की तलाश में है जब तक कि इसे रोक नहीं दिया जाता है, हर बार लूप को गोल करने के लिए विराम के साथ।

लेकिन उसके बाद फिर से...

मैं देख रहा हूं कि पहली सेवा को रुकने में लंबा समय लगता है, फिर बाद की सेवा के लिए "नेट स्टॉप" बस कुछ नहीं करने के लिए प्रकट होता है। सेवा प्रबंधक में सेवा को देखें, और इसकी स्थिति अभी भी "प्रारंभ" है - "स्टॉपिंग" में कोई बदलाव नहीं। फिर भी मैं SCM का उपयोग करके मैन्युअल रूप से इस दूसरी सेवा को रोक सकता हूं, और यह 3 या 4 सेकंड में बंद हो जाता है।


3

या आप इस cmd के साथ दूरस्थ सेवा शुरू कर सकते हैं: sc \\<computer> start <service>


3

मैंने अभी ऊपर जोनास के उदाहरण का उपयोग किया है और 0 से 24 त्रुटियों की पूरी सूची बनाई है। अन्य पोस्ट सही है net startऔर net stopकेवल errorlevelसफलता के लिए 0 और विफलता के लिए 2 का उपयोग करें ।

लेकिन यह मेरे लिए काम किया है:

net stop postgresql-9.1
if %errorlevel% == 2 echo Access Denied - Could not stop service
if %errorlevel% == 0 echo Service stopped successfully
echo Errorlevel: %errorlevel%

बदलें stopकरने के लिए startऔर रिवर्स में काम करता है।


3

मैनुअल सेवा पुनरारंभ ठीक है - services.msc में "रिस्टार्ट" बटन है, लेकिन कमांड लाइन में sc और net दोनों कमांड में "पुनरारंभ" स्विच का अभाव है और यदि पुनरारंभ को cmd / bat फाइल में शेड्यूल किया गया है, तो सेवा को रोक दिया जाता है और तुरंत शुरू कर दिया जाता है, कभी-कभी यह एक त्रुटि मिलती है क्योंकि सेवा अभी तक बंद नहीं हुई है, चीजों को बंद करने के लिए कुछ समय चाहिए।

यह एक त्रुटि उत्पन्न कर सकता है: sc stop sc start

टाइमआउट सम्मिलित करना एक अच्छा विचार है, मैं पिंग का उपयोग करता हूं (यह हर 1 सेकंड में पिंग करता है): sc stop ping localhost -n 60 sc start


2

यहाँ बैच का उपयोग करके सिस्टम पुनर्स्थापना शुरू करने के लिए विंडोज 10 कमांड है:

sc config swprv start= Auto

आप उन आदेशों को भी पसंद कर सकते हैं:

  • सिस्टम स्टार्ट को पुनर्स्थापित करने के लिए रजिस्ट्री मान बदलें

    REG ADD "HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f

  • एक सिस्टम पुनर्स्थापना बिंदु बनाएँ

    Wmic.exe / Namespace: \ root \ default पथ SystemRestore Call CreateRestorePoint "djibe ने आपके पीसी को सहेजा", 100, 12

  • सिस्टम पुनर्स्थापना डिस्क उपयोग बदलें

    vssadmin शैडोस्टोरेज़ / के लिए = C: / on = C: / maxsize = 10%

का आनंद लें


1

SC सेवाओं के साथ सब कुछ कर सकते हैं ... शुरू, बंद करो, जाँच, कॉन्फ़िगर, और अधिक ...


1

कभी-कभी आप पा सकते हैं कि स्टॉप काम नहीं करता है ।।

मेरा SQlServer कभी-कभी ऐसा करता है। निम्न कमांडलाइन का उपयोग करके इसे मारता है। यदि आपको वास्तव में सामान को मारने के लिए आपकी स्क्रिप्ट की आवश्यकता है, जो बंद नहीं करता है। मैं इसे अंतिम उपाय के रूप में करना चाहूंगा

taskkill /pid [pid number] /f

0

मैं C # में एक विंडोज़ सेवा लिख ​​रहा हूं, स्टॉप / अनइंस्टॉल / बिल्ड / इंस्टॉल / स्टार्ट लूप बहुत थका हुआ है। एक मिनी स्क्रिप्ट लिखी, इसे बुलाया reploy.batऔर लूप को स्वचालित करने के लिए मेरे विजुअल स्टूडियो आउटपुट डायरेक्टरी (एक जिसमें निर्मित सेवा निष्पादन योग्य है) में गिरा दिया।

बस इन 3 vars सेट करें

servicename : यह विंडोज सर्विस कंट्रोल पैनल (services.msc) पर दिखाई देता है

slndir : फ़ोल्डर (पूर्ण पथ नहीं) जिसमें आपका समाधान (.sln) फ़ाइल है

binpath : पूर्ण पथ (फ़ोल्डर पथ नहीं) निर्माण से निष्पादन योग्य सेवा के लिए

नोट: यह काम करने के लिए Visual Studio डेवलपर कमांड लाइन से चलाने की आवश्यकता है msbuild

SET servicename="My Amazing Service"
SET slndir="C:dir\that\contains\sln\file"
SET binpath="C:path\to\service.exe"
SET currdir=%cd%

call net stop %servicename%
call sc delete %servicename%
cd %slndir%
call msbuild 
cd %bindir%
call sc create %servicename% binpath=%binpath%
call net start %servicename%
cd %currdir%

शायद यह किसी की मदद करता है :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.