headon
Goto Top

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:
#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.

Content-ID: 519032

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

Ausgedruckt am: 22.11.2024 um 05:11 Uhr

TK1987
TK1987 26.11.2019 um 17:27:33 Uhr
Goto Top
Erstmal vorweg: Muss es unbedingt eine Batch sein? Mit Powershell wärest du hier wahrscheinlich besser beraten.
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.
Hier könnte ein weiteres Script hilfreich sein, welches die # löscht und direkt das Änderungsdatum aktualisiert.
HeadoN
HeadoN 26.11.2019 um 17:59:40 Uhr
Goto Top
Eigentlich nicht es muss nur ein Script sein was die Windows Aufgabenplanung ausführen kann.

Ja genau das mit dem Änderungsdatum ist ein Problem

Das mit der # bin ich schon am überlegen ob ich mir jeden Tag eine Verzeichnis Liste erstelle in einer Datei und dann die von gestern mit der von heute vergleiche und sehe wo die Raute entfernt wurde. Wenn entfernt wurde dann timestamp aktualisieren.

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.

Alternativ überlege ich das mittels eines Scriptes zu machen wo die Kollegen den Auftrag als erledigt markieren können. Das aber zum Beispiel mittels PHP über eine Intranet Seite zu machen, sehe ich da schon wieder als zu großen Aufwand. Hatte halt gehofft ich bekomme das einfach über Boardeigene Mittel hin.

Achja es ist übrigens eine Win2012 R2 Server
certifiedit.net
certifiedit.net 26.11.2019 um 18:11:01 Uhr
Goto Top
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
TK1987
Lösung TK1987 26.11.2019 aktualisiert um 19:33:46 Uhr
Goto Top
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?
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
HeadoN
HeadoN 02.12.2019 um 14:16:43 Uhr
Goto Top
Danke das löschen funktioniert wunderbar.
Habe es gerade lokal bei mir auf dem Rechner probiert (als .PS1 Datei) und da klappt es super nach dem ich gesehen hatte das der Arbeitspfad 2x definiert werden muss.

Gibt es jetzt die Möglichkeit das Löschprotokoll nicht nur als eine Datei zu haben sondern auch mehrere?
Idealerweise für jeden zu löschenden (Haupt)Ordner = 1 Datei.
TK1987
Lösung TK1987 02.12.2019 um 16:21:47 Uhr
Goto Top
Kein Problem face-wink
# Ü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
			}
		}
HeadoN
HeadoN 02.12.2019 um 16:44:42 Uhr
Goto Top
Perfekt ein ganz großes Dankeschön an dich.