fersl66
Goto Top

Batch, Editieren des Ergebisses einer Abfrage

Hallo Zusammen,

Habe eine Aufgabenstellung, bei der ich nicht recht weiß wie ich das lösen soll und ich habe Tante Google schon vielfach bemüht.

Erklärung.

Ich mache per Batch-Befehl eine Abfrage an den WSUS-Server, die mir ausgibt, welche Updatepackages nicht mehr genutzt werden.
Diese wird in einer Textdatei ausgegeben:
Das Ergebnis sieht so in etwa aus:

Von keinem der Updates im WSUS-Server wird auf die folgenden
Ordner verwiesen.
D:\WSUS\UpdateServicesPackages\10b50f93-4f4b-4926-bf3d-e8b329d1c4cb
D:\WSUS\UpdateServicesPackages\73f43f16-e77a-4adb-8803-e164c196c44b
D:\WSUS\UpdateServicesPackages\fe26213d-1606-4675-a503-0bc307ff84cb

Per find Befehl lasse ich mit alle Zeilen die den gültigen WSUS-Pfad enthalten ausgeben:

Das Ergebnis sieht dann so aus:

D:\WSUS\UpdateServicesPackages\10b50f93-4f4b-4926-bf3d-e8b329d1c4cb
D:\WSUS\UpdateServicesPackages\73f43f16-e77a-4adb-8803-e164c196c44b
D:\WSUS\UpdateServicesPackages\fe26213d-1606-4675-a503-0bc307ff84cb


Nun bräuchte ich ein Skript, welches mir dass mit jeweils vor die Zeile einen Befehl setzt.

Soll Ergebnis sollte dann so aussehen, damit ich per Task dann die Ordner löschen kann:

rmdir /s /q D:\WSUS\UpdateServicesPackages\10b50f93-4f4b-4926-bf3d-e8b329d1c4cb
rmdir /s /q D:\WSUS\UpdateServicesPackages\73f43f16-e77a-4adb-8803-e164c196c44b
rmdir /s /q D:\WSUS\UpdateServicesPackages\fe26213d-1606-4675-a503-0bc307ff84cb

Augenscheinlich nicht schwierig, aber ich weiß nicht, wie ich das so recht anstellen soll.

Viele werden fragen, warum macht er das überhaupt?
Na ja eine Patchmanagementlösung nutzt den WSUS zur Verteilung von Patches (Sehr effizient übrigens)
In der Anwendung kann man die Patches ablehnen wie auch im WSUS, nur bereinigt der WSUS diese nicht mehr benötigten Dateien nicht über die WSUS-Bereinigung.

Soviel zur Erklärung.

Content-ID: 278268

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

0x32f1
0x32f1 24.07.2015 um 16:03:45 Uhr
Goto Top
Wenn ich das richtig verstehe und du nur eine Bereinigung automatisiert durchführen möchtest, schau dir mal das an:

http://bent-blog.de/automatische-wsus-serverbereinigung-mit-tasks-und-s ...

Funktioniert bei mir sehr gut.
fersl66
fersl66 24.07.2015 um 17:49:39 Uhr
Goto Top
Danke für die Antwort! 0x32f1

Zitat von @0x32f1:

Wenn ich das richtig verstehe und du nur eine Bereinigung automatisiert durchführen möchtest, schau dir mal das an:

http://bent-blog.de/automatische-wsus-serverbereinigung-mit-tasks-und-s ...

Funktioniert bei mir sehr gut.


Das Problem ist, dass diese oben angesprochenen Updatepackages mit dieser Prozedur nicht bereinigt werden.
Das war auch meine erste Idee, denn für die Windows-Updates, die der WSUS selbst genehmigt, klappt das ja hervorragend.

Darum auch dieser etwas unkonventionelle Weg, der halt dann auch eine automatische Bereinigung dieser Patches mit sich bringen würde.
122990
122990 24.07.2015 aktualisiert um 18:04:50 Uhr
Goto Top
Moin,
@echo off
for /f "usebackq tokens=* delims=" %%a in ("C:\pfade.txt") DO @(  
    rmdir /s /q "%%a"  
)
Natürlich kann man auch die Ausgabe deines Findstr Befehls direkt einbauen ohne eine extra Texdatei zu nutzen, wenn du sie postest bauen wir sie dir oben ein.

Gruß grexit
fersl66
fersl66 25.07.2015 aktualisiert um 17:38:17 Uhr
Goto Top
Zitat von @122990:

Moin,
> @echo off
> for /f "usebackq tokens=* delims=" %%a in ("C:\pfade.txt") DO @(  
>     rmdir /s /q "%%a"  
> )
> 
Natürlich kann man auch die Ausgabe deines Findstr Befehls direkt einbauen ohne eine extra Texdatei zu nutzen, wenn du sie
postest bauen wir sie dir oben ein.

Gruß grexit

Hier ist das Skript:

wenn man das gleich in den findstr einbauen kann, nehme ich Dein Angebot gerne an.
Wenn ich den von Dir geposteten Code verwende werden die betroffenen Ordner sauber gelöscht, also das funktioniert schon mal!

Beginn:
rem * Skript zum löschen von nicht mehr benötigten Dateien im WSUS. *
rem * Datei muss mit erhöhten Rechten ausgeführt werden! *
rem * Abfrage der nicht mehr benötigten Updatefiles mit nachfolgendem Befehl: *

"C:\Program Files\Update Services\Tools\wsusutil" listunreferencedpackagefolders > D:\Admin\Batch\unused.txt

rem * Das Ergebnis gibt die nicht mehr benötigten Ordner aus *
rem * Wechseln in den Ausgabeordner *

D:
cd D:\Admin\batch

rem * Reduzieren auf die eigentlichen Pfade *

findstr /c:"D:\WSUS\UpdateServicesPackages" unused.txt >result.txt
del unused.txt

Danke grexit!
122990
122990 25.07.2015, aktualisiert am 29.07.2015 um 10:17:32 Uhr
Goto Top
OK, here we go:
@echo off
for /f "tokens=* delims=" %%a in ('"C:\Program Files\Update Services\Tools\wsusutil.exe" listunreferencedpackagefolders ^| findstr /i /c:"D:\WSUS\UpdateServicesPackages"') DO @(  
     echo %date% - Loesche Verzeichnis "%%a">>"c:\cleanup.log"  
     rmdir /s /q "%%a"  
)
fersl66
fersl66 26.07.2015 um 16:40:01 Uhr
Goto Top
Hallo grexit,

Vielen vielen Dank für deine Mühen!
Meine Lösung habe ich ja faktisch schon, das was du jetzt machst, ist ja nur das Ganze etwas eleganter und einfacher zu gestalten. face-smile

rein von der Logik her, fehlt doch hier die Option für wsusutil "listunreferencedpackagefolders" weil in deinem Scriptbeispielt ja nur das wsustool aufgerufen wird und das Ergebnis davon mit dem findstr durchsucht wird und danach die betroffenen Ordner gelöscht werden.
Aber ohne die Option "listunreferencedpackagefolders" wird das nicht zum Ziel führen.
Ich habs noch nicht getestet, aber wie gesagt, rein von der Logik geht das nicht.

Kann man das Ganze auch noch in eine Log schreiben mit > cleanup.log nach der geschlossenen Klammer?
Damit man später sieht was gemacht wurde?
122990
Lösung 122990 26.07.2015 aktualisiert um 20:44:42 Uhr
Goto Top
Sorry den Parameter hatte ich doch glatt übersehen, ist gefixt...
Kann man das Ganze auch noch in eine Log schreiben mit > cleanup.log
s. oben. (Pfad zur Logdatei wie gewünscht noch anpassen)
fersl66
fersl66 26.07.2015 um 20:46:00 Uhr
Goto Top
Vielen Dank für deine Mühe Grexit!

Ich probiers dieTage gleich nochmal aus.
Danke für die mehr als hilfreichen Antworten !!!
fersl66
fersl66 29.07.2015 aktualisiert um 12:09:30 Uhr
Goto Top
Zitat von @122990:

OK, here we go:
> @echo off
> for /f "tokens=* delims=" %%a in ('"C:\Program Files\Update Services\Tools\wsusutil"  
> listunreferencedpackagefolders ^| findstr /i /c:"D:\WSUS\UpdateServicesPackages"') DO @(  
>      echo %date% - Loesche Verzeichnis "%%a">>"c:\cleanup.log"  
>      rmdir /s /q "%%a"  
> )
> 

Hallo grexit

nun muss ich doch mich nochmal melden.

Da scheint was nicht zu passen mit der Pfadangabe. Es ist als würden die "" in der Pfadangabe ignoriert werden.
Hier ein paar Beispiele:
Folgende Meldung erhalte ich beim absetzen deines Skripts:

Der Befehl "C:\Program" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

Die gleiche Meldung erhalte ich, wenn ich das wsusutil ohne "" aufrufe:

C:\>C:\Program Files\Update Services\Tools\wsusutil listunreferencedpackagefolders
Der Befehl "C:\Program" ist entweder falsch geschrieben oderkonnte nicht gefunden werden.

Mit "" erhalte ich das korrekte Ergebnis

C:\>"C:\Program Files\Update Services\Tools\wsusutil" listunreferencedpackagefolders
Keiner der folgenden Ordner wird mehr von Updates verwendet, die auf Ihrem WSUS-Server vorhanden sind.
d:\WSUS\UpdateServicesPackages\03780d68-4b2e-4727-93fe-18082925a95d
d:\WSUS\UpdateServicesPackages\059e70fc-ce58-473c-9f47-081916e9c97e
d:\WSUS\UpdateServicesPackages\0b0a52d9-5ae3-411e-bde5-6ab8af52a50d
d:\WSUS\UpdateServicesPackages\14c43dc5-50c1-41cc-a8d1-abe7a7c7fd0d
d:\WSUS\UpdateServicesPackages\2cf5ffa9-2564-437c-b63a-5f056d7d482e
d:\WSUS\UpdateServicesPackages\30a45ac3-e99d-40df-bbc0-ce8deb338fe5
d:\WSUS\UpdateServicesPackages\4e9be609-86ed-45ab-8968-f47642c2ad2b
d:\WSUS\UpdateServicesPackages\517619d0-a3db-457f-8055-d7b11c4541d3
d:\WSUS\UpdateServicesPackages\c346e928-8bd2-412e-82a6-f8e13f05da51
d:\WSUS\UpdateServicesPackages\ff9f0332-7eb6-4ab1-80fa-3d901393488e

Wenn ich das Skript direkt in der Eingabeaufforderung absetze bekomme ich eine andere Meldung:

@echo off
for /f "tokens=* delims=" %%a in ('"C:\Program Files\Update Services\Tools\wsusutil" listunreferencedpackagefolders ^| findstr /i /c:"D:\WSUS\UpdateServicesPackages"') DO @(
"%%a" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
echo %date% - Loesche Verzeichnis "%%a">>"c:\cleanup.log"
rmdir /s /q "%%a"
Das System kann die angegebene Datei nicht finden.
)

Wenn ich das Skript so laufen lasse, bekomme ich zwar noch eine Meldung über einen nicht vorhandenen Pfad, aber es tut und loggt auch, was es gemacht hat!.

"C:\Program Files\Update Services\Tools\wsusutil" listunreferencedpackagefolders > C:\unused.txt

@echo off
for /f "usebackq tokens=* delims=" %%a in ("C:\unused.txt") DO @(
echo %date% - Loesche Verzeichnis "%%a">>"D:\WSUS\wsus-cleanup.log"
rmdir /s /q "%%a"
)


Kann das sein, dass die Anführungszeichen im der Befehlszeile ignoriert werden?
Wie gesagt ich hab auch keine Schmerz das über eine Textdatei zu machen, die dann wieder gelöscht wird.
Der Vorschlag das direkt in der Abfrage zu lösen kam ja von Dir face-wink
122990
122990 29.07.2015 aktualisiert um 10:20:41 Uhr
Goto Top
Geht hier problemlos, und das ganze gehört in eine Batchdatei, direkt in der Shell geht der Befehl so nicht ohne Anpassung.
Ist ein simpler Aufruf bei einem Pfad mit Leerzeichen, gab hier damit noch nie Probleme.

Vermutlich hast du ihn einfach fehlerhaft kopiert ...