kalidon
Goto Top

Batch Änderungsdatum von Dateien vergleichen und ältere löschen

Hallo zusammen,

ich habe schon andere Artikel und Foreneinträge zu diesem Thema (siehe Titel) gelesen, aber noch keine eindeutige Lösung gefunden.

Und zwar benötige ich Hilfe bei folgendem Problem:

Ich habe einen Ordner, in dem sich verschiedene Dateien unterschiedlichen Datums befinden.

Der Aufbau sieht etwa so aus:
datei-*.dat
datei-*.dat
datei-*.dat
datei-*.dat
...usw.
Das *-Symbol bezeichnet eine Zahlenfolge, die sich bei jeder Datei unterscheidet. Die Bezeichnung "datei-" ist bei jeder Datei gleich.

Nun brauche ich einen Batchskript, der die Dateien bezüglich ihres Änderungsdatums (nicht das Erstellungsdatum!) vergleicht und alle Dateien bis auf die neuste löscht.
Ich habe leider nur sehr rudimentäre Kenntnisse, was Batch-Programmierung angeht und hoffe, dass Ihr mir weiterhelfen könnt!

Vielen Dank schon mal im Voraus

Content-Key: 305324

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

Printed on: May 4, 2024 at 06:05 o'clock

Member: SaschaRD
SaschaRD May 25, 2016 updated at 14:37:55 (UTC)
Goto Top
Hallo @Kalidon,

hier ist ein kleines Powershell Skript:
gci "C:\MeinOrdner" | ?{$_.Name -like "datei-*.dat" -and $_.LastWriteTime -lt (get-date).adddays(-1)} | %{gp $_.PSPath | Remove-Item -recurse}  

Achtung! Dieses Skript löscht die Dateien in dem angegeben Pfad, an Hand des Namen und Dateityps datei-.dat.
Zum Testen kannst Du den hinteren Teil der Abfrage auskommentieren, dann erhälst Du erstmals nur die Dateien die Älter als einen Tag vom aktuellen Datum sind:
gci "C:\MeinOrdner" | ?{$_.Name -like "datei-*.dat" -and $_.LastWriteTime -lt (get-date).adddays(-1)}  
# | %{gp $_.PSPath | Remove-Item -recurse}

Enthält dein angegebener Ordner ebenfalls Unterordner die auch nachdem gleichen Namen und Dateityp gesucht und gelöscht werden sollen, dann füge ein -Recurse an die folgende Stelle hinzu:
gci "C:\MeinOrdner" -Recurse  

Gruß, Sascha
Member: Kalidon
Kalidon May 25, 2016 at 14:53:04 (UTC)
Goto Top
Hallo Sascha,

danke für die schnelle Antwort.

Ich habe den Script gerade ausgetestet, aber es sind nach Ausführen noch alle Dateien vorhanden.
Möglicherweise habe ich ihn auch falsch ausgeführt.

Ist es denn möglich, den Vergleich und das Löschen auch in einer Batch zu schreiben? Ich möchte diesen Part in eine andere Batch implementieren und würde ungern ein externes Programm starten.
Member: SaschaRD
SaschaRD May 25, 2016 updated at 15:10:43 (UTC)
Goto Top
Hallo @Kalidon,

das oben stehende Skript ist für Powershell, de facto musst Du eine Dateiname.ps1 Datei erstellen und diese ausführen. In einer Dateiname.bat wird das Ganze nicht funktionieren. Das erste Skript ist alles in einem, das zweite ist das Erste wo der Teil der die Lösung durchführt auskommentiert wurde (damit nicht beim Ausführen sofort deine Daten weg sind). Dritte ist einfach ein Zusatz.

Empfehlung weg von Batch und hinzu Powershell, wenn du den Code deiner anderen Batchdatei zur Verfügung stellst, könnte man dies bestimmt problemlos in ein einziges Powershell-Skript umschreiben.

Gruß, Sascha
Member: Biber
Biber May 25, 2016 at 15:11:34 (UTC)
Goto Top
Moin Kaildon,

Demo am CMD-Prompt:
C:\Users\Biber>for /f "skip=1" %i in ('dir X:\Ordner\datei_*.dat /b /a-d /o-D') do @echo del "X:\Ordner\%i"  

Nur Demo, weil mit "@echo del ..." nur gezeigt wird, was passieren würde.
FOR /F-Parameter "skip=1" überspringt die erste Zeile der Ausgabe.
Ausgabe ist: alle Dateien dieser Wildcard-Pattern ohne Directories sortiert nach Datum absteigend.

Grüße
Biber
Member: Kalidon
Kalidon May 25, 2016 at 15:29:19 (UTC)
Goto Top
Hallo Sascha,

so jetzt klappt es mit dem Powershellskript. Ich hatte die Datei auch vorher schon als .ps1 abgespeichert, aber über die Konsole aufgerufen. Vielleicht hat das nicht funktioniert, auch wenn es keinen Fehler gab. Über Rechtsklick "Mit Powershell ausführen" geht es einwandfrei. Vielen Dank dafür!

Ich weiß noch nicht ob ein Umschreiben der anderen Batch wirklich sinnvoll ist, da diese recht groß ist.

Wie kann ich den Powershellskript aus der Batch heraus aufrufen?
Mit diesem Befehl funkioniert es nicht, das wird von der Execution Policy verhindert.
PowerShell.exe -Command "& '%~Skript.ps1'"  
Member: Kalidon
Kalidon May 25, 2016 at 15:42:10 (UTC)
Goto Top
Hallo Biber,

über CMD funktioniert es. Was muss ich daran verändern, damit es auch über Batch funktioniert?

Grüße
Kalidon
Mitglied: 129413
129413 May 25, 2016 updated at 15:46:49 (UTC)
Goto Top
Zitat von @Kalidon:
über CMD funktioniert es. Was muss ich daran verändern, damit es auch über Batch funktioniert?
Die einzelnen Prozentzeichen verdoppeln, aus %i wird %%i.

Gruß skybird
Mitglied: 129413
129413 May 25, 2016 at 15:48:49 (UTC)
Goto Top
Zitat von @Kalidon:
Wie kann ich den Powershellskript aus der Batch heraus aufrufen?
Mit diesem Befehl funkioniert es nicht, das wird von der Execution Policy verhindert.
PowerShell.exe -Command "& '%~Skript.ps1'"  
powershell -Executionpolicy ByPass -File "C:\script.ps1"  
Member: Kalidon
Kalidon May 25, 2016 at 15:55:32 (UTC)
Goto Top
Hallo skybird,

dankeschön! Manchmal ist es zu banal:D

Super, es funktioniert genauso, wie ich es mir vorgestellt habe!

Ich danke Euch allen und wünsche noch einen schönen Abend!

Grüße, Kalidon
Member: Biber
Solution Biber May 25, 2016 updated at 16:22:32 (UTC)
Goto Top
Moin Kalidon,

ergänzend zu skybird natürlich zusätzlich noch das "@echo" rausnehmen zum Scharfschalten und FALLS die hypothetische Möglichkeit besteht, dass der Dateiname auch "datei_28 vom 12ten April.dat" heissen und also Leerzeichen kann, dann noch ein paar Anführungszeichen und ein "tokens=* delims=" für die FOR/F-Anweisung ergänzen.
:: irgendwo in einem altertümlichen Bätch...
Set "DeinOrdner=X:\Ordner"  
....
FOR /F "skip=1 tokens=* delims=" %%i in ('dir "%DeinOrdner%\datei_*.dat /b /a-d /o-D') do del "%DeinOrdner\%%i"  
....

Grüße
Biber
[Edit] ... und skybird sacht noch "Prozentzeichen verdoppeln..." [/Edit]