Jak mogę napisać skrypt bat lub cmd, aby niezawodnie zatrzymać i uruchomić usługę z kontrolą błędów (lub dać mi znać, że z jakiegokolwiek powodu nie powiodła się)?
288
Jak mogę napisać skrypt bat lub cmd, aby niezawodnie zatrzymać i uruchomić usługę z kontrolą błędów (lub dać mi znać, że z jakiegokolwiek powodu nie powiodła się)?
Odpowiedzi:
Użyj polecenia
SC
(kontrola usługi), daje o wiele więcej opcji niż tylkostart
&stop
.źródło
i
powiedzą ci, czy udało im się całkiem dobrze. Na przykład
W przypadku uruchamiania z pliku wsadowego masz dostęp do ERRORLEVEL kodu powrotu. 0 oznacza sukces. Coś wyższego wskazuje na niepowodzenie.
Jako plik nietoperza
error.bat
:Dane wyjściowe wyglądają następująco:
Kody zwrotne
Edytuj 20.04.2015
Kody zwrotne:
Zajrzyj tutaj: http://ss64.com/nt/net_service.html
źródło
NET
nie jest tylko dla funkcji usługowych związanych podczas gdySC
jest tylko dla funkcji usługowych związanych.errorlevel
zwracane jest 2, zobacz tutaj, jak interpretować wynik błędu .Możesz użyć polecenia NET START, a następnie sprawdzić zmienną środowiskową ERRORLEVEL, np
Oświadczenie: Napisałem to z góry głowy, ale myślę, że to zadziała.
źródło
Zamiast sprawdzania kodów, to też działa
źródło
Stworzyłem do tego mój osobisty plik wsadowy, mój jest nieco inny, ale możesz go modyfikować według własnego uznania. Stworzyłem to jakiś czas temu, ponieważ byłem znudzony i chciałem w prosty sposób umożliwić ludziom wprowadzanie zakończenia, startu, zatrzymania lub ustawienia auto. Ten plik BAT wymaga jedynie podania nazwy usługi, a resztę zrobi za Ciebie. Nie zdawałem sobie sprawy, że szuka czegoś, co wskazywałoby na jakiś błąd, musiałem źle odczytać tę część. Chociaż zazwyczaj można to zrobić, wprowadzając >> output.txt na końcu wiersza.
% Var% to tylko sposób, w jaki użytkownik może wprowadzić w tym celu swoją własną usługę, zamiast modyfikować plik nietoperza za każdym razem, gdy chcesz uruchomić / zatrzymać inną usługę.
Jeśli się mylę, każdy może mnie poprawić.
źródło
Korzystanie z kody powrotne
net start
inet stop
wydaje się, że najlepszym sposobem dla mnie. Spójrz na to: kody powrotu Net Start .źródło
Składnia zawsze mnie dopada .... więc ...
Oto wyraźnie, jak dodać wiersz do pliku wsadowego, który zabije usługę zdalną (na innym komputerze), jeśli jesteś administratorem na obu komputerach, uruchom .bat jako administrator, a maszyny są w tej samej domenie. Nazwa komputera jest zgodna z formatem UNC \ mój serwer
W tym przypadku ... p4_1 była zarówno nazwą usługi, jak i nazwą wyświetlaną, podczas przeglądania właściwości usługi w programie Service Manager. Musisz użyć nazwy usługi.
Dla ćpunów Ops Service ... pamiętaj, aby dołączyć kod przyczyny i komentarz! tzn. „4”, co równa się „Planowane” i komentarz „Zatrzymywanie serwera w celu konserwacji”
źródło
CMD
jako drugi użytkownik / identyfikator, arunas /user:Domain\UserName cmd
następnie wprowadź hasło. CMD zacznie działać jako określone konto użytkownika.Chcielibyśmy myśleć, że „net stop” zatrzyma usługę. Niestety rzeczywistość nie jest tak czarno-biała. Jeśli zatrzymanie usługi zajmuje dużo czasu, polecenie powróci przed zatrzymaniem usługi. Nie będziesz jednak wiedział, chyba że sprawdzisz poziom błędu.
Wydaje się, że rozwiązaniem jest pętla w poszukiwaniu stanu usługi aż do jej zatrzymania, z przerwą za każdym razem w pętli.
Ale potem znowu...
Widzę, że pierwsza usługa zajmuje dużo czasu, aby się zatrzymać, a potem „netto stop” dla kolejnej usługi po prostu wydaje się nic nie robić. Spójrz na usługę w menedżerze usług, a jej stan jest nadal „Uruchomiony” - bez zmiany na „Zatrzymanie”. Jednak mogę zatrzymać tę drugą usługę ręcznie za pomocą SCM i zatrzymuje się ona za 3 lub 4 sekundy.
źródło
lub możesz uruchomić usługę zdalną za pomocą tego polecenia cmd:
sc \\<computer> start <service>
źródło
Właśnie użyłem powyższego przykładu Jonasa i stworzyłem pełną listę poziomów błędu od 0 do 24. Inne posty są poprawne
net start
inet stop
używaj tylkoerrorlevel
0 dla sukcesu i 2 dla niepowodzenia.Ale to działało dla mnie:
Zmiana
stop
dostart
i działa w odwrotnym kierunku.źródło
Ręczne ponowne uruchomienie usługi jest w porządku - services.msc ma przycisk „Uruchom ponownie”, ale w wierszu poleceń zarówno polecenia sc, jak i net nie mają przełącznika „restart”, a jeśli ponowne uruchomienie zaplanowano w pliku cmd / bat, usługa jest zatrzymywana i uruchamiana natychmiast, czasami pojawia się błąd, ponieważ usługa nie została jeszcze zatrzymana, potrzeba czasu, aby ją zamknąć.
Może to generować błąd: sc stop sc start
Dobrym pomysłem jest wstawienie limitu czasu, używam polecenia ping (pinguje co 1 sekundę): sc stop ping localhost -n 60 sc start
źródło
Oto polecenie systemu Windows 10, aby uruchomić Przywracanie systemu za pomocą partii:
Możesz także polubić te polecenia:
Zmień wartość rejestru na automatyczne uruchamianie Przywracanie systemu
REG ADD „HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore” / v Wyłącz SR / t REG_DWORD / d 0 / f
Utwórz punkt przywracania systemu
Wmic.exe / Namespace: \ root \ default Path SystemRestore Wywołanie CreateRestorePoint „djibe save your PC”, 100, 12
Zmień użycie dysku Przywracania systemu
vssadmin zmień rozmiar shadowstorage / for = C: / on = C: / maxsize = 10%
Cieszyć się
źródło
SC
może zrobić wszystko z usługami ... uruchamiać, zatrzymywać, sprawdzać, konfigurować i więcej ...źródło
Czasami okazuje się, że przystanek nie działa ..
Mój SQlServer czasami to robi. Użycie następującego wiersza poleceń zabija go. Jeśli naprawdę potrzebujesz skryptu, aby zabijać rzeczy, które się nie kończą. Chciałbym to zrobić w ostateczności
źródło
Piszę usługę systemu Windows w języku C #, pętla stop / uninstall / build / install / start stała się zbyt męcząca. Napisałem mini skrypt, nazwał go
reploy.bat
i upuściłem w moim katalogu wyjściowym Visual Studio (takim, który ma wbudowany plik wykonywalny usługi), aby zautomatyzować pętlę.Po prostu ustaw te 3 zmienne
servicename
: pojawia się w panelu sterowania usługi Windows (services.msc)slndir
: folder (nie pełna ścieżka) zawierający plik rozwiązania (.sln)binpath
: pełna ścieżka (nie ścieżka folderu) do pliku wykonywalnego usługi z kompilacjiUWAGA: Aby polecenie działało, należy je uruchomić z wiersza polecenia programu Visual Studio Developer
msbuild
.Może to komuś pomaga :)
źródło