Batch Ordner löschen

Bumblebee_3rd

Ensign
Registriert
Jan. 2018
Beiträge
134
Hallo zusammen,

ich brauch eine Batch die mir in einem Verzeichnis die Ordner (incl. Inhalt) der letzten 30 Tage löscht.

Die Ordner sehen folgendermaßen aus:

18_01_2018
19_01_2018
20_01_2018 etc.

Das Verzeichnis wäre mal als Beispiel C:\Backup_Newsletter

folgenden Befehl teste ich gerade:

forfiles /p C:\Backup_Newsletter\ /s /-d -3 /c "cmd /c rd @file /s /q"

Was ist daran falsch? Kann es sein, dass ich das ausführlicher machen muss? -3 habe ich nur zum Testen gewählt

Es soll nicht via PowerShell sondern wirklich nur über eine Batch funktionieren.
 
Es gibt keinen Parameter -d. Mit "/d -3" wählst Du die Dateien und Verzeichnisse, die vor mehr als 3 Tagen geändert wurden.

Auch solltest Du prüfen, ob der gefundene Eintrag eine Datei oder ein Verzeichnis ist

Code:
forfiles /p "C:\Backup_Newsletter\" /s /d -3 /c "cmd /c If @isdir==TRUE rd @file /s /q"
 
@Andreas_: Danke für deine schnelle Antwort. Du hast natürlich Recht, -d gibt es nicht. Wenn ich den Befehl von dir ausführe, kommt aber nichts weiter, sprich er löscht mir die Ordner nicht raus. Ich habe zum Testen noch weitere Ordner erstellt aber es interessiert einfach nicht :freak:

Es sollte z.B. 23_01_2018 übrig bleiben und die Tage davor müssten eigentlich weg sein.
 
Ersetze mal @file durch @Path. Du kannst ja zum Testen die Ausgabe erst einmal in eine Datei umleiten:

Code:
forfiles /p "C:\Backup_Newsletter\" /s /d -3 /c "cmd /c If @isdir==TRUE ECHO @rd @path 2^>Nul" >"loeschen.bat"
 
Entschuldige, aber sowas kann man doch auch jetzt per PowerShell Script machen?
das kodieren davon muss mann bisschen lernen, aber ist durchaus möglich...

Ich werde sobald ich was mehr Zeit habe ein Beispiel machen... es sei denn es soll unbedingt CMD sein haha ;)
 
@mindwarper: Es soll unbedingt cmd sein :D
@Andreas_: Geht leider auch nicht. Heißt das wirklich @rd? Kann es sein, dass der Befehl nur nach Änderungsdatum geht und ihm eigentlich egal ist wie die Ordner heißen? Eigentlich schon oder?
 
Spar dir die Schleife...

mkdir C:\Backup_NewsletterTMP
robocopy /move /E /R:1 /W:1 /minage:30 C:\Backup_Newsletter C:\Backup_NewsletterTMP
rd /s /q C:\Backup_NewsletterTMP
 
@rocketworm: Warum C:\Backup_NewsletterTMP? Das wäre das Verzeichnis in das du erstmal alles verschieben möchtest?
Ich probiere es gerade an einem anderen System bei dem die Daten auch wirklich alt sind :D aber er mag immer noch nicht :lol:
 
Zuletzt bearbeitet:
Genau, Robocopy kann selbst nicht zum löschen benutzt werden. Das kann nur Kopieren und Verschieben.
Daher erst einen temporären Ordner erstellen, den alten kram mit robocopy da rüber schieben und anschließend den temporären Ordner löschen. Ich Benutze das um alte Logdateien zu eliminieren.
 
das ist auch eine sehr elegante Variante :D

Problem: Er macht bei mir einfach nix :o Ich seh einfach den Fehler nicht. Er müsste doch alles Ordner, Dateien etc. in diesen TMP Ordner kopieren und löschen?

R und W habe ich rausgenommen aber das dürfte ja nicht das Problem sein.
 
Überhaupt keinen :D Das ist ja das verblüffende und es ändert sich auch nix in meinem Ordner, sprich es ist alles da :evillol:

edit: Jetzt habe ich doch einen Fehler!

Hab ein Bild angehängt.
 

Anhänge

  • Fehler bat.JPG
    Fehler bat.JPG
    94,8 KB · Aufrufe: 750
Zuletzt bearbeitet:
Doch man kann robocopy zum löschen benutzen mit /MIR... es ist ein kleiner Trick ;)
Wenn ich gleich Zuhause bin von der Arbeit, werde ich euch einen Beispiel hier posten...

Ich bitte euch um etwas Geduld ;)
 
Zuletzt bearbeitet:
So schaut mein Befehl zur Zeit aus: Wo der TMP-Ordner liegt ist ja prinzipiell egal.

@ECHO OFF
CLS
mkdir C:\Backup_TMP
robocopy /move /E /minage:30 C:\Program Files\...\web\images C:\Backup_TMP rd /s /q C:\Backup_TMP

PAUSE
 
OK, wenn du nen Pfad mit Leerzeichen drin hast, dann musst du den Anführungszeichen setzen. Für robocopy ist der Parameter sonst beim Leerfeld zu ende.

Also so z.B.
robocopy /move /E /minage:30 "C:\Program Files\...\web\images" C:\Backup_TMP rd /s /q C:\Backup_TMP

@mindwarper nicht vergessen! :)
 
Zuletzt bearbeitet:
Ich habe jetzt den ganzen Pfad in Anführungszeichen dann kommt Fehler #8 :D

Der mag das /q nicht
 
So, ich bin jetzt dabei und ich habe es hier für euch :) so wie gesagt und versprochen :)
@rocketworm, habe es nicht vergessen! Warum auch, als ich helfen kann werde ich auch einfacherweise

Der Clou ist einfach den Verzeichnis in das Verzieichnis NULL zu kopieren, und voila, gut ist :)

Oder etwa einen leeren Ordner über das "original" zu kopieren mit den Parameter /MIR (= /E und /PURGE zusammen) oder bloß nur /PURGE (d.h. ohne /E) = löschen :D
oder etwa nicht damit einverstanden ??? hahaha :D
Bloß nicht umgekehrt !!!

Das ist der Trick, was ich gemeint habe.
das ist etwa äquivalent in Unix/Linux zu
Code:
cp dir /dev/null

Also hier ist der Code was ich gebrauchen würde :)
aufgepasst: Ich würde erst als Test die zu löschen Ordner bzw. Dateien in einen Test-Ordner Verschieben und dann testen, testen, testen... :)

Code:
@echo off

set srcDir="C:\Program Files\...\web\images"
set tmpDir="C:\ZZ_TEST"
set logDir="C:\ZZ_Log"
set logFile0="%logDir%\Dir-File_MOVE.log"
set logFile1="%logDir%\30day_Remove_%date%.log"

robocopy /E /ZB /BYTES /FP /NC /TS /XJ /MOVE /minage:30 %srcDir %tmpDir% /LOG:%logFile0%
robocopy /E /R:1 /W:1 /ZB /BYTES /FP /NC /TS /XJ %tmpDir% NULL /LOG:%logFile1%

Wenn dass nicht klappen würde, versuch mal diesen, mit den Leeren Verzeichnis
Code:
@echo off

set srcDir="C:\Program Files\...\web\images"
set tmpDir="C:\ZZ_TEST"
set emptyDir="C:\ZZ_EMPTY"
set logDir="C:\ZZ_Log"
set logFile0="%logDir%\Dir-File_MOVE.log"
set logFile1="%logDir%\30day_Remove_%date%.log"

robocopy /E /ZB /BYTES /FP /NC /TS /XJ /MOVE /minage:30 %srcDir %tmpDir% /LOG:%logFile0%
robocopy /MIR /R:1 /W:1 /ZB /BYTES /FP /NC /TS /XJ %emptyDir% %tmpDir% /LOG:%logFile1%

Dann wenn es gut klappt kannst Du es auch "direkt" versuchen, aber das würde ich eher abraten...
Weis auch nicht ob das mit der /minage gut gehen wird im "direkten" Modus, also eher erst verschieben in einem temporären Verzeichnis, so wie oben

Code:
@echo off

set srcDir="C:\Program Files\...\web\images"
set emptyDir="C:\ZZ_EMPTY"
set logDir="C:\ZZ_Log"
set logFile0="%logDir%\30day_Remove_%date%.log"

robocopy /MIR /R:1 /W:1 /ZB /BYTES /FP /NC /TS /XJ /minage:30 %emptyDir% %srcDir% /LOG:%logFile0%

Hoffe dass ich euch hier mit geholfen habe :D
Ergänzung ()

Und dann mit PowerShell... Warum auch nicht ? ;)

Den -WhatIf Parameter kan mann nutzen zum testen, was passieren würde ohne diesen Parameter... Also ohne das aktuelle löschen :) = Perfekt für testen :D

Code:
$limit      = 30
$cutoffDate = (Get-Date).AddDays(-$limit)
     
$srcDir     = "C:\Program Files\...\web\images"
$logDir     = "C:\ZZ_Log"
$logFile    = "$logDir\$limit" + "-day_Remove_$(Get-Date -format ddMMyyyy_HHmmss).log"
     
start-transcript -Path $logFile
     
Get-ChildItem -Recurse -Force -Attributes D,A,H,R,S -Path $srcDir |
    Where-Object { $_.LastWriteTime -lt $cutoffDate } |
    ForEach-Object {
                        # Remove-Item $_.FullName -Recurse -Force -Verbose -WhatIf
                        Remove-Item $_.FullName -Recurse -Force -Verbose
                   }
     
stop-transcript
 
Zuletzt bearbeitet: (Fehler in Code korrigiert & extra Info & PowerShell Info)
Bumblebee_3rd schrieb:
@Andreas_: Geht leider auch nicht. Heißt das wirklich @rd? Kann es sein, dass der Befehl nur nach Änderungsdatum geht und ihm eigentlich egal ist wie die Ordner heißen? Eigentlich schon oder?
Forfiles arbeitet ähnlich wie der Dir-Befehl, er durchsucht also die Dateistruktur.

Bei mir funktioniert
Code:
forfiles /p C:\Backup_Newsletter\ /s /d -3 /c "cmd /c If @isdir==TRUE rd @path /s /q"
ohne Probleme. Der Pfad darf nicht in Anführungsstrichen stehen, das war der Fehler bei meinem Beispiel.

Da Forfiles /s rekursiv arbeitet kommt es zwangsläufig zu Fehlermeldungen. Forfiles will in das Verzeichnis wechseln, welches Du vorher gelöscht hast und kann dieses nicht mehr finden. Wenn Dich die Fehlermeldungen stören, kannst Du ein 2>NUL an den Befehl anhängen.

Gerade noch mal getestet - man kann den Pfad in Anführungszeichen setzen, er darf dann aber nicht mit einem Backslash abschließen. Das hier:
Code:
forfiles /p "C:\Backup_Newsletter" /s /d -3 /c "cmd /c If @isdir==TRUE rd @path /s /q"
funktioniert also auch.
 
Zuletzt bearbeitet: (Hinweis auf Fehlermeldungen ergänzt)
Danke euch erstmal für die Mühe :)

Gibts irgenwelche Probleme wenn im Pfad Leerzeichen enthalten sind?
 
Sollte nicht soviel Probleme geben, es sei denn man sollte unbedingt den Pfad in Anführungszeichen aufgeben...
Und dann einfach testen erst...
 
Zuletzt bearbeitet:
Zurück
Oben