marcimarc85
Goto Top

BATCH benötigt, die Dienste beendet und wartet bbis sie nicht mehr in der Taskliste sind

Hallo,

Ich habe vor ieniger Zeit mal ein Batsch- Script erstellt, was mir betsimmte Diensete einer Software Aplikation aus der Diensteübersicht aufruft und diese dann, sofern noch nicht geschen, startet:

::alle APP Dienste ermitteln, die im Status "Stopped" stehen und in die Liste "liste.txt" schreiben 
::-------------------------------------------------------------

wmic path win32_service get Caption, State, StartMode |findstr "APP"|findstr "Stopped" |findstr "Auto">liste.txt  
SET "liste=liste.txt"  



::Dienste aus "liste.txt" einlesen und starten 
::-------------------------------------------------------------

for /f  "tokens= 2"  %%f in (%liste%) do (  
ECHO The service APP %%f was not running but will be restart now:
net start "APP %%f"  
SET priority=1

)


::"liste.txt" löschen 
::-------------------------------------------------------------

if exist liste.txt del liste.txt

Nun muss ich dieses Script genau andersrum laufen lassen. Also ich muss die Dienste sauber beenden, da beim "Abschießen" evtl. noch Schreibvorgänge in Projektdateien stattfinden , die dadurch nicht abgeschlossen werden können und somit die Projektdatei ungültig machen, sodass diese erneut geladen werden muss von der Software.

Ich würde daher gern mit dem Befehl

:waitforservice_app
   tasklist /fi "imagename eq %_app_exe%" 2>nul | find /i /n "%_app_exe:~0,25%" >nul  
   if %errorlevel%==0 goto waitforservice_app

Das Problem ist, wie bekomme ich den korrekten Namen der exe-datei, des jeweiligen Dienstes in die Variable _app_exe ?
Die Software lässt mehrere Dienste im Hintergrund laufen. Mit der ersten Abfrage, werden diese alle in eine Liste -> liste.txt geschrieben. Jetzt müsste ich noch irgendwie eine Abfrage einbauen, die die in die Liste geschriebenen Dienste in einer Schleife einliest und den Pfad zur exe-Datei des jeweiligen Dienstes in die Variable übernimmt. Und da stehe ich gerade etwas auf dem Schlauch.
Der Pfad zur exe Datei kann man sich ja über die Eigenschaften des Dienstes anzeigen lassen. Wie aber mache ich das per cmd/batch?

Grüße

Marc

Content-Key: 400614

Url: https://administrator.de/contentid/400614

Printed on: April 24, 2024 at 15:04 o'clock

Mitglied: 138721
138721 Feb 06, 2019 updated at 14:49:13 (UTC)
Goto Top
Immer noch am Batschen face-big-smile, sowas macht man doch heutezutage mit PS, naja wenn man's unbedingt kryptisch mag bidde
@echo off
for /f "usebackq delims=" %%a in ("C:\liste.txt") DO (  
  echo checking service exe for service '%%a'  
	for /f "tokens=1,2* delims==" %%b in ('wmic service where Name^="%%~a" get PathName /value ^| find "="') do call :CHECK "%%~nc"  
)
goto :EOF

:CHECK
tasklist /fi "IMAGENAME eq %~1.*" | findstr /ilc:"%~1" >nul 2>&1 && echo Waiting for '%~1' to terminate. & timeout /t 1 >nul & goto :CHECK || echo '%~1' terminated.  
Gruß l.
Member: MarciMarc85
MarciMarc85 Feb 07, 2019 at 05:37:40 (UTC)
Goto Top
Vielen Dank. Ich probiere das gleich mal aus.
Powershell würde ich auch gern verwenden, nur muss ich mich damit erst vertratuter machen. Wie würde denn das Vorhaben in Powershell aussehen?

Also:
1. Alle Dienste auflisten, die mit "APP" beginnnen
2. Die Dienste so beenden , dass sie nicht mehr in der Taskliste stehen

Grüße

Marc
Member: MarciMarc85
MarciMarc85 Feb 07, 2019 at 07:32:50 (UTC)
Goto Top
Dein batch Script schein noch nicht so wirklich zu funktionieren. Ich hab mir mal die Ausgabe anzeigen lassen:

C:\Users\hage02\Desktop>(
' o checking service exe for service 'APP-License
" get PathName /value | find "="') do call :CHECK "%~nc" Name="APP-License
)
'hecking service exe for service 'APP-License
Keine Instanzen verfügbar.

Ich hab mal geschaut und mit
wmic service get PathName | findstr "APP"  
bekomme ich den Pfad zu allen exe-dateien der Anwendungen aufgelistet. im prinzip müsste das doch dasselbe, wie in deiner for-Schleife sein. Allerdings wird dort scheinbar die exe.Datei am Ende nicht erkannt und mit Vorhandensein in der Taskliste verglichen.
Mitglied: 138721
138721 Feb 07, 2019 updated at 08:36:44 (UTC)
Goto Top
Klappt hier aber face-smile, dann sind deine Services in der Textdatei nicht mit dem Servicenamen sondern displaynamen aufgelistet...
Hausaufgabe die du jetzt mit der Vorlage auch selbst lösen kannst. Ist ja schon Mundgerecht serviert worden.

1. Alle Dienste auflisten, die mit "APP" beginnnen
Das ist Blödsinn, dazu gehören dann auch Windows-Services ...
Stopped  AppIDSvc           Anwendungsidentität
Running  Appinfo            Anwendungsinformationen
Running  Apple Mobile De... Apple Mobile Device Service
Stopped  AppMgmt            Anwendungsverwaltung
Stopped  AppReadiness       App-Vorbereitung
Stopped  AppVClient         Microsoft App-V Client
Running  AppXSvc            AppX-Bereitstellungsdienst (AppXSVC)
aber wenn du das unbedingt willst
Stop-Service -Name APP* -Force
Member: MarciMarc85
MarciMarc85 Feb 07, 2019 at 08:26:02 (UTC)
Goto Top
"APP" ist in diesem Fall nur ein Platzhalter, aus Datenschutzgründen.

Anwendung UserServer
Anwendung Server
Anwendung-MySQL57
Anwendung-License
Anwendung ExportService
Anwendung DataService
Anwednung Notification

So sehen die Dienstnamen beispielhaft bei uns aus. die exe-dateien dann so in etwa

userserver.exe
anwendung_server.exe
mysqld --defaults-file=d:\anwendung\enterprise\conf\my-rs-57.ini Anwendung-MySQL57
lmgrd.exe
exportservice.exe
dataservice.exe
notification.exe
Mitglied: 138721
138721 Feb 07, 2019 updated at 08:30:49 (UTC)
Goto Top
So sehen die Dienstnamen beispielhaft bei uns aus
Das sind Displaynamen keine echten Dienstnamen die intern verwendet werden und auf die habe ich das Skript oben ausgelegt! Kannst du aber leicht anpassen indem du stattdessen in der Where Bedingung des wmic Befehls die entsprechende Eigenschaft DisplayName angibst
Member: MarciMarc85
MarciMarc85 Feb 07, 2019 at 09:18:44 (UTC)
Goto Top
Grundsätzlich verstehe ich das Script. wenn ich die Kommandos einzeln ausführe, bekomme ich , im Prinzip auch die gewünschten werte, aber irgendwie wird die :CHECK Aufgabe nicht abgearbeitet.

ich habe in der liste.txt einfach mal 'Editor' per Hand als erkannten DisplayName eingesetzt. wenn ich das Script dann starte, sollte eigentlich der Taskt 'notepad.exe' der hinter dem Editor hängt, beendet werden. Das wird er aber nicht. Auch hier wird keine Instanz gefunden:

C:\Users\hage02\Desktop>(
echo checking service exe for service 'Editor'  
 for /F "tokens=1,2* delims==" %b in ('wmic service where DisplayName="Editor" get PathName /value | find "="') do call :CHECK "%~nc"  
)
checking service exe for service 'Editor'  
Keine Instanzen verfügbar.

C:\Users\hage02\Desktop>goto :EOF

C:\Users\hage02\Desktop>