unauthorized-user
Goto Top

(Batch): "Find" Befehl nach aktuellem Datum filtern

Guten Morgen an alle,

für die Dokumentation der Server-Updates habe ich eine winzige *.Bat-Datei geschrieben, welche mir alle installierten Updates in eine Text-Datei schreibt.
Natürlich benötige ich hier nicht die Updates von vor 5 Jahren, sondern nur die, die zuletzt installiert wurden, bzw. nur die vom selben Tag.


Meine Batch sieht Momentan so aus:

dism /online /get-Packages > C:\Update.txt
find /i "30.11.2017" C:\Update.txt > C:\Update_today.txt  
echo Vorgang abgeschlossen
 pause
 goto :eof


1. Problem:

Ist es möglich, nicht nur die Zeile herauszufiltern, in der das Datum gefunden wurde, sondern auch die drei Zeilen darüber?


2. Problem:

ich möchte nicht jedes mal die Batch an den aktuellen Tag anpassen. Gibt es ein "Date-Code", der einfach das aktuelle Datum verwendet und einfügt?

Also Quasi

find "%current_date%" C:\...   



Für hilfreiche Antworten wäre ich sehr dankbar!

Gruß

Content-Key: 356760

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

Printed on: April 23, 2024 at 11:04 o'clock

Member: Friemler
Solution Friemler Dec 01, 2017 updated at 13:21:38 (UTC)
Goto Top
Hallo,

schau Dir mal folgendes an:
@echo off & setlocal

:: ------------- Konfiguration ---------------
set "OutFile=D:\Update_today.txt"  
:: -------------------------------------------

set "Day="  
set "Month="  
set "Year="  

for /f "tokens=1-3 delims=." %%a in ("%DATE%") do (  
  set "Day=%%a"  
  set "Month=%%b"  
  set "Year=%%c"  
)

(for /f "tokens=1-4 delims=|" %%a in ('dism /online /get-Packages /format:table') do (  
   for /f "tokens=1-3 delims=. " %%x in ("%%d") do (  
     if "%%x" equ "%Day%" if "%%y" equ "%Month%" if "%%z" equ "%Year%" (  
       for /f %%l in ("%%a") do (set /p "=%%l;" < NUL)  
       for /f %%l in ("%%b") do (set /p "=%%l;" < NUL)  
       for /f %%l in ("%%c") do (set /p "=%%l;" < NUL)  
       for /f %%l in ("%%d") do (set /p "=%%l;" < NUL)  
       echo(
     )
   )
)) > "%OutFile%"  

Die FOR-Schleife in den Zeilen 11-15 zerlegt das aktuelle Datum in seine Bestandteile, dabei wird allerdings vom deutschen Datumsformat ausgegangen (dd.MM.yyyy). Das gleiche gilt für die FOR-Schleife in Zeile 18.

In Zeile 19 wird der Datumsvergleich ausgeführt, wenn Du hier z.B. nur Monat und Jahr berücksichtigen möchtest, kannst Du das entsprechend abändern.

Die Zeilen 20-24 geben die Daten der Treffer im CSV-Format aus (pro Datensatz eine Zeile, getrennt durch Semikolon). Wenn Du lieber das Listenformat möchtest, ersetze die Zeilen 20-24 durch folgenden Code:
       for /f %%l in ("%%a") do echo %%l  
       for /f %%l in ("%%b") do echo %%l  
       for /f %%l in ("%%c") do echo %%l  
       for /f %%l in ("%%d") do echo %%l  
       echo(

Die FOR-Schleifen in den beiden Code-Blöcken dienen dazu, die umschließenden Leerzeichen zu entfernen.

ACHTUNG!!!
Die Ausgabedatei wird auf einem deutschen Windows mit der Zeichencodierung OEM850 erstellt. Da ein Package den Status "Abgelöst" haben kann (die zweite Spalte in der CSV-Datei) wird dieser Wert in Excel oder einem Editor mit ANSI-Zeichencodierung nicht korrekt dargestellt (das ö macht Probleme). Die Datei sollte am besten nur mit weiteren Batchscripts weiterverarbeitet werden.

Grüße
Friemler
Member: em-pie
em-pie Dec 01, 2017 updated at 13:07:42 (UTC)
Goto Top
Moin,

ggf. hilft dir die Powershell weiter:
https://www.pdq.com/blog/using-get-childitem-find-files/ -> Finding Old Files

Get-ChildItem | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-3)} 

Kombiniert mit der Funtkion outfile bekommst du den KRam dann sicherlich auch in eine Textdatei geschrieben

 ... | Out-File C:\yout\Path\result.txt 

Gruß
em-pie
Member: unauthorized-user
unauthorized-user Dec 05, 2017 at 07:51:05 (UTC)
Goto Top
Hey Friemler,

vielen Dank für deine so ausführliche Antwort!
Ich bin vorherige Woche leider nicht mehr dazu gekommen das ganze auszuprobieren.
Heute Morgen habe ich auf einer VM testweise ein Update installiert und deine Batch ausprobiert. Das ganze hat auch auf Anhieb geklappt.
Genau so hatte ich mir das gedacht.

Vielen Dank dafür!

Bzgl. deines Hinweises: Darauf werde ich beim nächsten Update-Prozess mal Achten und ggf. eine weitere Batch schreiben.

Gruß
unauthorized-user