Batch: Löschen von Ordnern + Dateien welche ein bestimmtes Zeichen nicht enthalten
Hallo zusammen,
da batch Programmierung nun wirklich nicht meins ist und ich bisher nichts wirklich passendes gefunden habe, bzw das nicht auf meine Bedürfnisse anpassen konnte die Frage an euch.
Ich brauche ein Script welches automatisch regelmäßig bestimmte Ordner löscht und mir ein Löschprotokoll anfertigt.
Vorraussetzungen:
Es gibt ein Verzeichnis wo Aufträge drin liegen. Aufträge die aktuell bearbeitet werden, sind in Ordnern mit einer # am Anfang markiert.
Nun sollen regelmäßig alle Ordner welche keine # am Anfang haben inklusive Dateien und Unterordner gelöscht werden. Die Unterordner enthalten niemals eine #.
Weiterhin soll das erst 14 Tage nach Entfernung der # passieren (bekommt man das raus? Anderungsdatum greift da ja anscheinend nicht) und es soll für jeden Ordner eine Datei angefertigt werden wo drin steht welche Dateien gelöscht wurden in dem Verzeichnis.
da batch Programmierung nun wirklich nicht meins ist und ich bisher nichts wirklich passendes gefunden habe, bzw das nicht auf meine Bedürfnisse anpassen konnte die Frage an euch.
Ich brauche ein Script welches automatisch regelmäßig bestimmte Ordner löscht und mir ein Löschprotokoll anfertigt.
Vorraussetzungen:
#Ordner1
Ordner1
Ordner2
Ordner3
Ordner4
Ordner5
#Ordner2
Ordner1
Ordner2
Ordner3
Ordner4
Ordner5
Ordner3
Ordner4
Ordner5
Es gibt ein Verzeichnis wo Aufträge drin liegen. Aufträge die aktuell bearbeitet werden, sind in Ordnern mit einer # am Anfang markiert.
Nun sollen regelmäßig alle Ordner welche keine # am Anfang haben inklusive Dateien und Unterordner gelöscht werden. Die Unterordner enthalten niemals eine #.
Weiterhin soll das erst 14 Tage nach Entfernung der # passieren (bekommt man das raus? Anderungsdatum greift da ja anscheinend nicht) und es soll für jeden Ordner eine Datei angefertigt werden wo drin steht welche Dateien gelöscht wurden in dem Verzeichnis.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 519032
Url: https://administrator.de/contentid/519032
Ausgedruckt am: 22.11.2024 um 05:11 Uhr
7 Kommentare
Neuester Kommentar
Erstmal vorweg: Muss es unbedingt eine Batch sein? Mit Powershell wärest du hier wahrscheinlich besser beraten.
Hier könnte ein weiteres Script hilfreich sein, welches die # löscht und direkt das Änderungsdatum aktualisiert.
Zitat von @HeadoN:
Weiterhin soll das erst 14 Tage nach Entfernung der # passieren (bekommt man das raus? Anderungsdatum greift da ja anscheinend nicht) und es soll für jeden Ordner eine Datei angefertigt werden wo drin steht welche Dateien gelöscht wurden in dem Verzeichnis.
Das Problem hierbei wird sein, dass das Änderungsdatum beim umbenennen nicht aktualisiert wird - es also erstmal keine Möglichkeit gibt, später herauszufinden wann genau die # gelöscht wurde.Weiterhin soll das erst 14 Tage nach Entfernung der # passieren (bekommt man das raus? Anderungsdatum greift da ja anscheinend nicht) und es soll für jeden Ordner eine Datei angefertigt werden wo drin steht welche Dateien gelöscht wurden in dem Verzeichnis.
Hier könnte ein weiteres Script hilfreich sein, welches die # löscht und direkt das Änderungsdatum aktualisiert.
Würde wie folgt vorgehen:
a) Prüfen ob # vorgehängt ist und
b) ein Timestamp angehängt ist,
wenn beides nicht vorhanden ist, hänge heutiges Datum an.
c) wenn # nicht vorangehängt und ein Timestamp angehängt ist, der zu dem >14 Tage alt ist, lösche den Ordner.
Kommt natürlich noch, wie schon angerissen, auf den Workflow an. Wenn Ihr eine feste Ordnerstruktur mit Querverlinkungen in ERP o.ä habt, müsste man das über eine txt Datei machen. - je nach dem.
Viele Grüße,
Christian
a) Prüfen ob # vorgehängt ist und
b) ein Timestamp angehängt ist,
wenn beides nicht vorhanden ist, hänge heutiges Datum an.
c) wenn # nicht vorangehängt und ein Timestamp angehängt ist, der zu dem >14 Tage alt ist, lösche den Ordner.
Kommt natürlich noch, wie schon angerissen, auf den Workflow an. Wenn Ihr eine feste Ordnerstruktur mit Querverlinkungen in ERP o.ä habt, müsste man das über eine txt Datei machen. - je nach dem.
Viele Grüße,
Christian
Zitat von @HeadoN:
Generell ist es so das die # von den Kollegen entfernt wird wenn der Auftrag erledigt wurde. Ich habe damit also eigentlich gar nichts zu tun. So das ich also auch nicht sehe wann die # entfernt wurde.
Wenn ich das richtig verstehe, würde es also doch schon reichen zu überprüfen, ob in Ordnern ohne # eine Datei liegt, die jünger als 2 Wochen ist - richtig?Generell ist es so das die # von den Kollegen entfernt wird wenn der Auftrag erledigt wurde. Ich habe damit also eigentlich gar nichts zu tun. So das ich also auch nicht sehe wann die # entfernt wurde.
In dem Fall:
# Übergreifender Ordner
$ARBEITSPFAD='C:\Test'
# Schreibe alle Ordner, die nicht mit einer # beginnen in $ORDNER
$ORDNER=ls -dir $ARBEITSPFAD | ? { $_.Name -notmatch "^#" }
# Für Jeden Ordner, der nicht mit einer # beginnt
foreach ($A in $ORDNER) {
# Liste Dateien in Ordner auf, die neuer als 14 Tage sind
$DATEIEN=ls $A.FullName -Recurse | ? { $_.LastWriteTime -gt (get-date).AddDays(-14)}
# Wenn keine Dateien neuer als 14 Tage vorhanden
if (! $DATEIEN) {
$A | select FullName,LastWriteTime | Export-Csv -Append -Delimiter ';' -Encoding Default -NoTypeInformation $ARBEITSPFAD\Gelöschte-Objekte.csv
ls -r $A.FullName | select FullName,LastWriteTime | Export-Csv -Append -Delimiter ';' -Encoding Default -NoTypeInformation $ARBEITSPFAD\Gelöschte-Objekte.csv
#rm -R $A.FullName
}
}
Die Zeile $Arbeitspfad= musst du anpassen. Darin werden Alle Ordner, die nicht mit einer # beginnen auf Dateien durchsucht, die jünger als 14 Tage sind. Sind keine solchen vorhanden, wird der Ordner, sowie alle darin enthaltenen Ordner und Dateien in eine CSV-Datei in dem Arbeitspfad geschrieben. Das löschen des Ordners (Zeile 16) ist momentan noch auskommentiert, damit du erst mal die CSV-Datei überprüfen kannst.
Achja es ist übrigens eine Win2012 R2 Server
Ok, gibts darauf überhaupt schon Powershell? Müsste man sonst nachinstallieren
Kein Problem
# Übergreifender Ordner
$ARBEITSPFAD='C:\Test'
# Schreibe alle Ordner, die nicht mit einer # beginnen in $ORDNER
$ORDNER=ls -dir $ARBEITSPFAD | ? { $_.Name -notmatch "^#" }
# Für Jeden Ordner, der nicht mit einer # beginnt
foreach ($A in $ORDNER) {
# Liste Dateien in Ordner auf, die neuer als 14 Tage sind
$DATEIEN=ls $A.FullName -Recurse | ? { $_.LastWriteTime -gt (get-date).AddDays(-14)}
# Wenn keine Dateien neuer als 14 Tage vorhanden
if (! $DATEIEN) {
ls -r $A.FullName | select FullName,LastWriteTime | Export-Csv -Append -Delimiter ';' -Encoding Default -NoTypeInformation ($ARBEITSPFAD+'\'+$A.BaseName+'.csv')
rm -R $A.FullName
}
}