2010-07-24 12 views
71

Chcę napisać plik wsadowy, który wykonuje następujące operacje:Jak sprawdzić, czy usługa jest uruchomiona za pośrednictwem pliku wsadowego i uruchomić go, jeśli nie jest uruchomiony?

  • sprawdzić, czy usługa jest uruchomiona
    • Jeśli jest uruchomiony, zamknij partię
    • Jeśli to nie działa, uruchom usługa

próbki kodu google dotąd okazały się nie być pracy, więc postanowiłem nie PO st je.

rozpoczynając usługa jest wykonywana przez:

net start "SERVICENAME" 
  1. Jak mogę sprawdzić, czy usługa jest uruchomiona, i jak zrobić if w program wsadowy?
  2. Jestem trochę zdezorientowany. Jaki argument mam do przekazania na start netto? Nazwa usługi lub jej wyświetlana nazwa?
+2

Brudny programowanie: kiedy jedyną rzeczą, którą chcesz zrobić, to uruchomić Jeśli usługa nie działa, po prostu uruchom polecenie start. Jeśli nie jest uruchomiony, uruchomi usługę. Jeśli jest uruchomiony, otrzymasz komunikat o błędzie, ale usługa jest uruchomiona (i nie zatrzymuje się). Brudne, ale działa. Jednakże, jeśli chcesz wykonać inne komentarze tylko wtedy, gdy musisz uruchomić usługę, to zdecydowanie przejdź do wersji od zera. –

+0

@Peter Schuetze: Tak, twój sprzeciw jest poprawny, jeśli uruchomienie usługi jest jedynym celem. Włączyłem także logowanie zaczyna się i tak dalej, więc trzymałem się rozwiązania lc. – citronas

Odpowiedz

123

Aby sprawdzić stan usługi, użyj sc query <SERVICE_NAME>. For jeśli bloki w plikach wsadowych, check the documentation.

Poniższy kod będzie sprawdzić status usługi MyServiceName i uruchomić go, jeśli nie jest uruchomiony (if blok zostanie wykonany, jeśli usługa nie jest uruchomiona):

for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName" ^| findstr "  STATE"') do (
    if /I "%%H" NEQ "RUNNING" (
    REM Put your code you want to execute here 
    REM For example, the following line 
    net start "MyServiceName" 
) 
) 

Wyjaśnienie co robi :

  1. Zapytuje o właściwości usługi.
  2. Wygląda na linii zawierającej tekst „państwo”
  3. Tokenizes tej linii, i wyciąga 3rd tokena, który jest jeden zawierający stan usługi.
  4. Testy powstałego państwa przeciwko smyczkowy „Running”

Co do drugiego pytania, argument będzie chciał przejść do net start jest nazwa usługi, nie nazwa wyświetlana.

+0

Awesome. Dzięki za twój wysiłek. Niestety to nie działa? Może jestem za głupi na to. Zamieniłem "MyServiceName" na "SCardSvr" (escaped) jako test, wstawiłem wszystko do pliku wsadowego, wykonałem go, ale usługa nie uruchamia się. Nawet jeśli zastąpię net start czymś innym, np. Drukiem do pliku, nie zostanie ono wykonane. Czy mógłbyś wziąć drugie spojrzenie, proszę? =) – citronas

+0

Ups Miałem kilka dodatkowych rzeczy w pierwszej linii ... Spróbuj tego. A jeśli to nie działa, co się stanie, gdy uruchomisz 'sc query" SCardSvr "' z wiersza poleceń? –

+1

Czy masz "SCardSvr" w cudzysłowach? Nie wierzę, że tak powinno być, – LittleBobbyTables

12

To powinno zrobić:

FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING" 
IF ERRORLEVEL 1 SC start %%a) 
17

można użyć następującego polecenia, aby sprawdzić, czy usługa jest uruchomiona lub nie:

sc query [ServiceName] | findstr /i "STATE" 

Gdy uruchomię go na moim NOD32 Antivirus, I otrzymujemy:

STATE      : 4 RUNNING 

Jeśli zostało zatrzymane, chciałbym uzyskać:

STATE      : 1 STOPPED 

Możesz użyć tego w zmiennej, aby określić, czy korzystasz z NET START, czy nie.

Nazwa usługi powinna być nazwą usługi, a nie nazwą wyświetlaną.

+1

Dzięki za pomoc, próbując zintegrować to, co napisałeś, znacznie podnosimy swoje umiejętności w zakresie partii;) – citronas

27

Aby przełączyć usługę, użyj następującego polecenia;

NET START "Distributed Transaction Coordinator " || NET STOP "Distributed Transaction Coordinator "

+1

Działa z powodu kodu wyjścia od początku. Jeśli polecenie start nie powiedzie się, prawdopodobnie jest już uruchomione (i tak czy inaczej, zatrzymanie go nie zaszkodzi), więc próbujesz go zatrzymać. –

+3

polecenie ma strukturę taką, że jeśli start netto nie powiedzie się, to go zatrzymuje (ze względu na || co oznacza jeszcze), ale jeśli uruchomi się net start, to net stop nie zostanie wykonany. znakomity! –

+0

Bardzo prosta sztuczka używana często w programowaniu! – Birla

4

Cuando se korzystania z systemu Windows en Español, el código debe quedar asi (podczas korzystania z systemu Windows w języku hiszpańskim, kod jest):

for /F "tokens=3 delims=: " %%H in ('sc query MYSERVICE ^| findstr "  ESTADO"') do (
    if /I "%%H" NEQ "RUNNING" (
    REM Put your code you want to execute here 
    REM For example, the following line 
    net start MYSERVICE 
) 
) 

Reemplazar MyService con el nombre del servicio que se desea procesar. Puedes ver el nombre del servicio viendo las propiedades del servicio. (Wymień MyService z nazwą usługi, która ma być przetwarzana. Można zobaczyć nazwę usługi na właściwości serwisowych.)

+8

Będzie lepiej dla każdego, jeśli napiszesz odpowiedź po angielsku. – j0k

+1

Nie wiem, dlaczego upadł. Jest to ważny punkt i powód, aby unikać porównań łańcuchów, jeśli to możliwe. W takim przypadku musisz zmienić ciąg w zależności od domyślnego języka docelowej instalacji systemu Windows. –

+2

@lc: Czy rozsądnie byłoby podać odpowiedź dla każdego języka? Bardziej użyteczne może być odniesienie (lub uwzględnienie) zasobu, który mówi, jaki łańcuch wyszukiwania danego języka. –

2
@echo off 

color 1F 


@sc query >%COMPUTERNAME%_START.TXT 


find /I "AcPrfMgrSvc" %COMPUTERNAME%_START.TXT >nul 

IF ERRORLEVEL 0 EXIT 

IF ERRORLEVEL 1 NET START "AcPrfMgrSvc" 
1

Chciałem również e-mail wysyłany jeżeli usługa został rozpoczęty w ten sposób więc dodaje trochę do kodu @Ic po prostu myślałem, że bym go opublikował na wszelki wypadek. Kiedyś SendMail ale istnieją inne opcje linii poleceń How to send a simple email from a Windows batch file?

set service=MyServiceName 

for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "  STATE"') do (
    if /I "%%H" NEQ "RUNNING" (

    net start %service% 

    for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "  STATE"') do (
     if /I "%%H" EQ "RUNNING" (
     SendMail /smtpserver localhost /to [email protected] /from [email protected] /subject Service Autostart Notification /body Autostart on service %service% succeded. 
    ) else (
     SendMail /smtpserver localhost /to [email protected] /from [email protected] /subject Service Autostart Notification /body Autostart on service %service% failed. 
    ) 
    ) 

) 
) 
5

Właśnie znalazłem ten wątek i chciał dodać do dyskusji, jeśli dana osoba nie chce korzystać z pliku wsadowego do ponownego uruchomienia usługi. W systemie Windows istnieje opcja, jeśli przejdziesz do usług, właściwości usługi, a następnie odzysku. Tutaj możesz ustawić parametry usługi. Jak ponownie uruchomić usługę, jeśli usługa zostanie zatrzymana. Ponadto można nawet wykonać drugą próbę niepowodzenia, aby zrobić coś innego, niż w przypadku ponownego uruchomienia komputera.

+2

Jest to przydatna odpowiedź, jednak należy pamiętać, że działa tylko wtedy, gdy usługa została zatrzymana przy wyjściu (-1). Jeśli usługa została zakończona z wdziękiem (nawet z komunikatem o błędzie), automatyczne przywracanie nie zostanie uruchomione. Nie spowoduje również aktywacji, jeśli usługa została zabita ręcznie przez użytkownika. –

9

Wersja niezależna od wersji językowej.

@Echo Off 
Set ServiceName=Jenkins 


SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
    echo %ServiceName% not running 
    echo Start %ServiceName% 

    Net start "%ServiceName%">nul||(
     Echo "%ServiceName%" wont start 
     exit /b 1 
    ) 
    echo "%ServiceName%" started 
    exit /b 0 
)||(
    echo "%ServiceName%" working 
    exit /b 0 
) 
+0

Tak! "Przestrzeń" zawsze uderza nagle w plecy! –

+0

Prawie idealna odpowiedź. Po prostu naprawiłbym tę linię: Początek sieci "% ServiceName%"> nul || ( – Cesar

+0

Powodowałem, że skrypt jest uniwersalny, więc pozwala mi używać go w zadaniach Windows Scheduler. Po prostu zamień "Set ServiceName = Jenkins" na 'Set ServiceName =% ~ 1' i nazwij go jak' watch-service.bat "Jenkins" ' –

0
@Echo off 

Set ServiceName=wampapache64 

SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(

echo %ServiceName% not running 
echo 

Net start "%ServiceName%" 


    SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
     Echo "%ServiceName%" wont start 
    ) 
     echo "%ServiceName%" started 

)||(
    echo "%ServiceName%" was working and stopping 
    echo 

    Net stop "%ServiceName%" 

) 


pause 
1

uruchomieniu usługi przy użyciu skryptu PowerShell. Możesz połączyć to z harmonogramem zadań i wywołać go w określonych odstępach czasu lub w razie potrzeby. Utwórz ten plik jako plik PS1, tj. Plik z rozszerzeniem PS1, a następnie pozwól, aby ten plik został wyzwolony z harmonogramu zadań.

Aby uruchomić usługę zatrzymania

harmonogramu zadań, jeśli używasz go na serwerze użytku w tej argumentacji

-noprofile -executionpolicy obwodnicę -file "C: \ Scripts Usługa ponownego uruchamiania \ StopService.PS1"

zweryfikować, uruchamiając tym samym na cmd jeśli działa to powinno działać na harmonogramu zadań również

$Password = "Enter_Your_Password" 
$UserAccount = "Enter_Your_AccountInfor" 
$MachineName = "Enter_Your_Machine_Name" 
$ServiceList = @("test.SocketService","test.WcfServices","testDesktopService","testService") 
$PasswordSecure = $Password | ConvertTo-SecureString -AsPlainText -Force 
$Credential = new-object -typename System.Management.Automation.PSCredential -argumentlist $UserAccount, $PasswordSecure 

$LogStartTime = Get-Date -Format "MM-dd-yyyy hh:mm:ss tt" 
$FileDateTimeStamp = Get-Date -Format "MM-dd-yyyy_hh" 
$LogFileName = "C:\Users\krakhil\Desktop\Powershell\Logs\StartService_$FileDateTimeStamp.txt" 


#code to start the service 

"`n####################################################################" > $LogFileName 
"####################################################################" >> $LogFileName 
"###################### STARTING SERVICE ##########################" >> $LogFileName 

for($i=0;$i -le 3; $i++) 
{ 
"`n`n" >> $LogFileName 
$ServiceName = $ServiceList[$i] 
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName 

Write-Output "`n####################################" 
Write-Output "Starting Service - " $ServiceList[$i] 

"$LogStartTime => Starting Service: $ServiceName" >> $LogFileName 
Start-Service $ServiceList[$i] 

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]} 

if($ServiceState.Status -eq "Running") 
{ 
"$LogStartTime => Started Service Successfully: $ServiceName" >> $LogFileName 
Write-Host "`n Service " $ServiceList[$i] " Started Successfully" 
} 
else 
{ 
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName 
Write-Output "`n Service didn't Start. Current State is - " 
Write-Host $ServiceState.Status 
} 
} 

#code to stop the service 

"`n####################################################################" > $LogFileName 
"####################################################################" >> $LogFileName 
"###################### STOPPING SERVICE ##########################" >> $LogFileName 

for($i=0;$i -le 3; $i++) 
{ 
"`n`n" >> $LogFileName 
$ServiceName = $ServiceList[$i] 
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName 

Write-Output "`n####################################" 
Write-Output "Stopping Service - " $ServiceList[$i] 

"$LogStartTime => Stopping Service: $ServiceName" >> $LogFileName 
Stop-Service $ServiceList[$i] 

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]} 

if($ServiceState.Status -eq "Stopped") 
{ 
"$LogStartTime => Stopped Service Successfully: $ServiceName" >> $LogFileName 
Write-Host "`n Service " $ServiceList[$i] " Stopped Successfully" 
} 
else 
{ 
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName 
Write-Output "`nService didn't Stop. Current State is - " 
Write-Host $ServiceState.Status 
} 
} 
Powiązane problemy