eggebert
Goto Top

Vorhandene Dienste mit Liste vergleichen

Auf einem WindowsXP-Rechner sollen die Namen aller Windows-Dienste abgefragt werden.
In einer Textdatei (vorgabe.txt) sind zeilenweise Namen von Windows-Dienste, für die es bereits eine Vorgabe gibt, hinterlegt.
Die Ausgabe soll mir anzeigen, für welche Dienste auf dem PC es noch keine Vorgabe gibt bzw. welche Dienste nicht in der vorgabe.txt vorhanden sind.

Eine Erweiterung wäre....
In einer Textdatei (vorgabe.txt) sind zeilenweise Namen von Windows-Dienste mit Status und Autostarttyp hinterlegt.
z.B. clipsrv,running,auto oder tapisrv,stopped,demand

Für jeden Dienst auf dem PC werden die Dienste laut "Vorgabe" gesetzt.
Kommt ein Dienst nicht in der Liste vor bzw. der Dienst kann nicht laut Vorgaben gesetzt werden, soll der Name des Dienstes angezeigt oder in eine andere Textdatei z.B. Fehlend.txt geschrieben werden.

Bisher habe ich versucht alle Dienste in eine Datei zu speichern und dann zu prüfen, ob z.B. der Dienstname in beiden Dateien vorhanden ist.
z.B. sc query type= service state= all| findstr /r /C:"SERVICE_NAME:" >tmpsrv.txt

Jedoch ist das sehr umständlich, da man ja vielleicht mit einer For-Schleife Dienst für Dienst auf dem PC abrufen und prüfen könnte, ob der Name in der vorgabe.txt vorhanden ist oder fehlt.

Kann mir bitte jemand weiterhelfen oder hat einen Tip dafür?

Danke.

Egge

Content-Key: 121299

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

Printed on: April 26, 2024 at 14:04 o'clock

Member: bastla
bastla Jul 25, 2009 at 08:08:22 (UTC)
Goto Top
Auch Dir ein freundliches Hallo und willkommen im Forum!

Die "sc"-Ausgabe, wie Du es bereits skizziert hast, zwischenzuspeichern und dann zeilenweise zu vergleichen könnte etwa so gehen:
@echo off & setlocal
set "Vorgabe=D:\vorgabe.txt"  
set "Aktuell=%temp%\aktuell.txt"  

sc query type= service state= all| findstr /C:"SERVICE_NAME:" >"%Aktuell%"  

echo Nicht in der Vorgabe enthaltene Dienste:
for /f "usebackq delims=" %%i in ("%Aktuell%") do findstr /x /c:"%%i" "%Vorgabe%">nul || echo %%i  
Grüße
bastla
Member: Eggebert
Eggebert Aug 01, 2009 at 20:56:31 (UTC)
Goto Top
Hab nochmal ein bißchen gebastelt. Deine Lösung hat funktioniert.

Danke.

Egge
Member: Eggebert
Eggebert Aug 04, 2009 at 00:04:08 (UTC)
Goto Top
Hab doch nochmal eine Frage....

Der Befehl
sc query type= service state= all| findstr /C:"SERVICE_NAME:" >"%Aktuell%"   
erzeugt in der Datei aktuell.txt z.b. folgende Einträge :
SERVICE_NAME: ALG
SERVICE_NAME: Alerter
SERVICE_NAME: AppMgmt

Wie müsste man folgende Zeile ändern...
for /f "usebackq delims=" %%i in ("%Aktuell%") do findstr /x /c:"%%i" "%Vorgabe%">nul || echo %%i  
..damit der Suchstring von %%i nicht z.B. "SERVICE_NAME: ALG" sondern "ALG" lautet ?

Ich würde die Werte in der Vorgabe.txt gerne in einem Format speichern, wie z.b.
ALG,demand
Alerter,disabled
AppMgmt,auto

Kann man beim Abspeichern irgendwie nur der Name ohne "SERVICE_NAME: " bewerkstellligen ?

Kann man in dem Suchstring %%i die Zeichenkette "SERVICE_NAME: " wegschneiden?

Ist zwar extrem falsch aber soll die Richtung "zeigen" was ich meine ...
for /f "usebackq delims=" %%i in ("%Aktuell%") do ( set "x=%%i") && "!x:~14!" findstr /x /c:"%%i" "%Vorgabe%">nul || echo %%i  

Hat jemand eine Idee ?

Egge
Member: bastla
bastla Aug 04, 2009 at 05:30:33 (UTC)
Goto Top
Hallo Eggebert!

Da Du aus der jeweiligen Zeile alles nach dem ersten Leerzeichen benötigst, sollte es etwa so gehen:
for /f "usebackq tokens=1*" %%i in ("%Aktuell%") do findstr /x /c:"%%j" "%Vorgabe%">nul || echo %%j
Zu beachten wäre ev noch, dass "findstr" derzeit (wegen "/x") nach komplett übereinstimmenden Zeilen sucht ...

Grüße
bastla