Batch Dateien älter als X Tage in gewissen Ordnern löschen

thixo

Cadet 4th Year
Registriert
Dez. 2010
Beiträge
91
Guten Tag zusammen,

ich hätte eine kleine Herausforderung vor der ich im Moment auf der Arbeit stehe und hoffe mir kann jemand helfen.

Folgende Situation:

Jeder unserer User hat ein persönliches Laufwerk das auf unserem Fileserver gespeichert ist. Auf diesem Laufwerk gibt es einen tmp-Ordner der von einer Software bei uns im Haus mit tmp-Files gefüllt wird.
DUMMERWEISE ist die Software aber nicht so intelligent und gut programmiert, dass ich angeben könnte nach wievielen Tagen die tmp-Files gelöscht werden sollen... Aussage SW-Hersteller "Das ist Betreiberaufgabe." (wie ich diesen Satz als Kunde HASSE...)
Nichts desto trotz müsste ich nun eine Lösung für das Problem finden (SW-Hersteller wechseln geht nicht ;) )

Auf dem Fileserver sieht das gesamte Verzeichnis in etwa so aus:
E:\user\USERNAME\Software\tmp\tmp
(das Doppel-tmp ist leider wirklich so... keine Ahnung was die sich damals dabei gedacht haben -> war vor meiner Zeit bei meiner jetzigen Firma ;) )

Ich kenne bereits delage32, allerdings habe ich es mit dem Skript nicht geschafft auch die unterschiedlichen User-Ordner einzubeziehen. Mit delage32 wüsste ich nur, wie ich in EINEM Ordner Dateien älter als X-Tage löschen lassen kann.
Für jeden einzelnen User ein eigenes Skript + geplanten Task anzulegen wäre bei >200 Usern dann doch etwas "too much" ^^
Der Ordner Software\tmp\tmp ist bei ALLEN Usern gleich.
Pro User, pro Tag fallen ca 5-10 tmp-Files á ca. 40-60 kb an, was in der Masse natürlich echt richtig viel ist.

Würde mich freuen, wenn mir jemand helfen könnte :)

So far, vielen Dank und Grüße
 
Variante 1: forfiles

forfiles kann allerdings nicht mit UNC-Pfaden umgehen (\\Server\Freigabe\)

Code:
Forfiles /P E:\Ordner\ /S /M *.* /D -8 /C "cmd /c del /q @path"

/P E:\Ordner               : Pfad auf dem die Suche gestartet werden soll
/S                         : Bitte mit allen Unterordnern
/M *.*                     : Suchmaske - hier alle Dateien (ausser denen ohne Dateiendung)
/D -8                      : Letztes Änderungsdatum älter als 8 Tage zum heutigen Datum
/C "cmd /c del /q @path"   : Befehl der mit diesen Dateien ausgeführt werden soll (hier löschen)





Variante 2: robocopy


Code:
robocopy.exe E:\Ordner E:\TEMP /E /MOVE /MINAGE:8 /R:1 /W:1
rmdir E:\TEMP /s /q

mkdir E:\TEMP              : Verzeichnis E:\TEMP erstellen

E:\Ordner                  : Quellordner
E:\TEMP                    : Zielordner
/E                         : inklusive Unterverzeichnisse
/MOVE                      : verschieben statt kopieren
/MINAGE:8                  : Mindestalter, Dateien die jünger als 8 Tage sind werden ignoriert
/R:1                       : Bei Fehler 1x noch mal versuchen
/W:1                       : zwischen Wiederholungen 1 Sekunde warten (bei Fehler)

rmdir E:\TEMP /s /q        : Verzeichnis E:\TEMP inklusive Unterverzeichnissen ohne Nachfrage löschen


Lg, Franz


Quelle: http://znil.net/index.php?title=Windows:Dateien_die_älter_sind_als_X_Tage_per_Skript_/_Batch_löschen
 
Mit PowerShell einfach zu lösen, sind die Home-Laufwerke denn alle im selben Ordner abgelegt (und auch nur diese), sodass man einfach JEDEN Ordner des Parentfolder gleich behandeln kann?
 
Hallo Franz,

vielen Dank für die schnelle Rückmeldung.
Das alles würde mit delage32 auch funktionieren. Problem ist allerdings, dass auf diesem persönlichem Laufwerk der User natürlich auch wichtige Files gespeichert werden, die auch älter sein können und nicht gelöscht werden sollen.

E:\user\USERNAME\Software\tmp\tmp

Kann man für den Ordner USERNAME (variiert natürlich für jeden User, heißt es gibt >200 Ordner) auch eine Art Platzhalter verwenden?
Ergänzung ()

wirelessy schrieb:
Mit PowerShell einfach zu lösen, sind die Home-Laufwerke denn alle im selben Ordner abgelegt (und auch nur diese), sodass man einfach JEDEN Ordner des Parentfolder gleich behandeln kann?

Da hab ich zum tippen bissl lange gebraucht.
Ja, jeden Ordner des Parentfolders kann man gleich behandeln.
 
E:\user\%username%\Software\tmp\tmp

wäre dein Zielpfad mit Variable.

Testen kannst es in der CMD zB mit echo %username%

lg
fire
 
Dann müsste das Skript aber bei jedem User separat laufen, was so schwer machbar sein wird.
 
Ich weiß nicht, es gibt doch auch foreach-Schleifen in Batch? Dann führst du das auf einen Ordner und ALLE Unterordner aus.

Batchscripts sind aber so ätzend zu schreiben, ich würds in PowerShell machen. Deutlich verständlicher das ganze^^.
 
hast du da zufällig ein beispiel an dem ich mich orientieren könnte?
 
Unten stehendes Script löscht alle .tmp-Dateien in einem Ordner (inkl. Unterordner), die älter als das gesetzte Datum sind. Nicht getestet!

Kann man auch ergänzen um eine Überprüfung, ob \tmp\tmp\ im Pfad vorkommt - auch statt der Filterung auf .tmp-Dateien.

Code:
function getTMPofPaths($path)
{
    $output = New-Object 'System.IO.FileInfo[]' 0
    foreach($_ in $path)
    {
        if(Test-Path $_)
        {
            $output += Get-ChildItem $_ -Recurse -Include "*.tmp";
        }
    }

    $counter = 1;

    return $output | Select-Object -Unique FullName, CreationTime
}

$homepath = "\\pfad\zu\den\laufwerken"
$deleteDate = [datetime]"12/24/2014"

$arrayOfTMP = getTMPofPaths($homepath)
foreach($sample in $arrayOfTMP)
{
    if($sample.CreationDate -le $deleteDate)
    {
        Remove-Item $sample.Fullname -Confirm:$false
    }
}
 
Zuletzt bearbeitet:
Zurück
Oben