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
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 305324
Url: https://administrator.de/contentid/305324
Printed on: May 4, 2024 at 06:05 o'clock
10 Comments
Latest comment
Hallo @Kalidon,
hier ist ein kleines Powershell Skript:
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:
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:
Gruß, Sascha
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
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
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
Moin Kaildon,
Demo am CMD-Prompt:
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
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
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.über CMD funktioniert es. Was muss ich daran verändern, damit es auch über Batch funktioniert?
Gruß skybird
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.
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"
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.
Grüße
Biber
[Edit] ... und skybird sacht noch "Prozentzeichen verdoppeln..." [/Edit]
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]