lionheart
Goto Top

Verzeichnisse nach Datum löschen

Guten Morgen zusammen!

Ich stehe aktuell vor einem kleinen Problem und weiß aktuell nicht, wie ich dieses per Batchskript lösen soll.

Es gibt in meinem Netzwerk das Verzeichnis \Austausch, welches von allen Anwendern als temporäres Austauschverzeichnis verwendet wird.
Nun sollen die darin vorhandenen Dateien einmal täglich in ein Unterverzeichnis verschoben werden, welches nach dem aktuellen Tagesdatum in der Schreibweise "JJJJMMTT" benannt werden soll. Anschließend sollen alle Verzeichnis unter \Austausch, die älter als 7 Tage sind, gelöscht werden.

Im Prinzip soll ein Aufräumprozess erstellt werden, damit die Datenflut auf diesem Verzeichnis eingebremst wird. Durch die "Disziplin" der Anwender ist dieses Ziel leider nicht zu erreichen.

Könnt ihr mir bei diesem Skript weiterhelfen?

Ein Verzeichnis mit dem heutigen Tagesdatum zu erstellen bekomm ich hin. Aber wie kann ich die Ordnerbezeichnung mit dem aktuellen Tagesdatum vergleichen um die Verzeichnisse anschließend zu entfernen?

Vielen Dank im Voraus.

Content-Key: 114572

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

Printed on: April 19, 2024 at 14:04 o'clock

Member: Scroller
Scroller Apr 24, 2009 at 11:17:05 (UTC)
Goto Top
hi,

kannst du dort Powershell verwenden?
Das wäre einfacher
gruss scroller
Mitglied: 77559
77559 Apr 24, 2009 at 12:17:50 (UTC)
Goto Top
Zitat von @Lionheart:
Hallo Lionheart.

Ein Verzeichnis mit dem heutigen Tagesdatum zu erstellen bekomm ich hin.
Wenn du schon einen Batch angefangen hast, dann poste ihn doch.

Aber wie kann ich die Ordnerbezeichnung mit dem aktuellen Tagesdatum vergleichen um die Verzeichnisse anschließend zu > entfernen?

Wenn keine anderen Ordner da sind (mit ählicher Datumsstruktur) brauchst du das gar nicht.
@echo off
pushd "DeinAustauschOrdner"  
for /f "skip=7 delims=" %%A in ('dir /B /AD /O-N 20* ^|findstr "^[0-9]*$') do echo RD /Q /S  "%%A"  
popd


Pushd wechselt in den Ordner (legt bei einer URL auch temporär ein Lw an)
for /f arbeitet Zeile für Zeile die Ausgabe des/der Befehle in ' ' ab.
dir listet relevante Verzeichnisse dieses Jahrhunderts absteigend auf
findstr filtert auf Verzeichnisse die nur aus Zahlen bestehen
der skip=7 sorgt dafür das die 7 neuesten übersprungen werden.

Wenn dir die Ausgabe des Ganzen gefällt, nimm das echo raus damit die Befehle auch ausgeführt und nicht nur angezeigt werden.

Gruß
LotPings
Mitglied: 77559
77559 Apr 24, 2009 at 12:27:22 (UTC)
Goto Top
Hallo Scroller,

ich finde die Powershell, spez. PS2 ctp3 ja auch ganz interessant.
Aber sie zu empfehlen ohne konkret zu zeigen wie einfach es dort ist und ohne den Overhead zu erwähnen der ggfs mit der Installation verbunden ist, ist meiner Meinung nach nicht sehr hilfreich.

Ausserdem sollte eine vorgeschlagene Lösung doch in möglichst vielen Umgebungen laufen können ohne irgendwelche Voraussetzungen zu machen.

Gruß
LotPings
Member: Biber
Biber Apr 24, 2009 at 12:29:05 (UTC)
Goto Top
Moin Scroller,
Zitat von @Scroller:
kannst du dort Powershell verwenden?
Das wäre einfacher
gruss scroller

Da hast Du zwar grundsätzlich Recht, weil "Rechnen" mit Datumswerten im Batch wirklich wenig anmutig ist.

Andererseits gäbe es zwei Überlegungen, die die Problematik entschärfen und PowerShell in diesem Fall verzichtbar erscheinen lassen.

Erstens: eine Forumssuche nach "Dateien nach Alter löschen" oder ähnliches bringt reichlich Nur-Batch-Lösungen.

Zweitens: Wenn doch ohnehin schon erarbeitet ist, wie täglich ein neuer Ordner der Namenskonvention "..\Austausch\JJJJMMTT" angelegt wird und es davon nur sieben geben darf und die ältesten zuerst gelöscht werden sollen...

Ja hey, dann braucht niemand mit Datumswerten rechnen
FOR /f  "skip=7" %i IN ('dir /AD /b /s /o-d X:\Austausch\20??????') DO @echo RD /s /q %~fi  

Diese Zeile am CMD-Prompt zeigt an, welche Unterzeichnisse gelöscht werden würden.

Grüße
Biber
[Edit] Uups, viel zu langsam.....[/Edit]
Mitglied: 77559
77559 Apr 24, 2009 at 13:20:06 (UTC)
Goto Top
Zitat von @Biber:
FOR /f  "skip=7" %i IN ('dir /AD /b /s /o-d X:\Austausch\20??????') DO @echo RD /s /q %~fi  
> 
Hallo Biber, Wenn jemand in den Tagesverzeichnissen etwas ändert, ändert sich auch das Ordnerdatum, ich würde also lieber nach dem Namen sortieren.

[Edit] Uups, viel zu langsam.....[/Edit]
Viel halte ich für übertrieben face-wink

Gruß
LotPings
Member: Biber
Biber Apr 24, 2009 at 14:28:46 (UTC)
Goto Top
Moin LotPings,

Wenn jemand in den Tagesverzeichnissen etwas ändert, ändert sich auch das Ordnerdatum
Ja, stimmt schon. Das könnte man/frau ja noch abfangen, indem der DIR-Befehl noch die /Tc-Option mit auf den Weg bekommt [also "nimm das Erstellungsdatum des Ordners"].

Aber natürlich - bevor wir uns da auf dünnes Eis begeben (kann ja sein, dass es gar kein NTFS-Ordner ist oder alle 2000xxxx-Verzeichnisse zeitlich nicht unterscheidbar mit einer FOR/L-Anweisung angelegt worden sind etc pp)

--> dann doch lieber, wie Du es in Deiner Variante gezeigt hast, einfach über die sortierten Ordnernamen gehen gänzlich ohne Datums/Altersprüfung. Insofern FULL ACK.

Grüße
Biber
Member: Scroller
Scroller Apr 26, 2009 at 09:30:11 (UTC)
Goto Top
Zitat von @77559:

Hi LotPings
hier ein paar Bemerkungen
Gruss
maikl

----
Hallo Scroller,

ich finde die Powershell, spez. PS2 ctp3 ja auch ganz interessant.
Aber sie zu empfehlen ohne konkret zu zeigen wie einfach es dort ist

Wieso soll ich hier ein Script basteln und reinstellen wenn ich nicht weis ob er es verwenden kann?
Kann ich immer noch nach einer ANwort von Ihm machen.


und ohne den Overhead zu erwähnen der ggfs mit der Installation
verbunden ist, ist meiner Meinung nach nicht sehr hilfreich.

Was für einen mit der Installation verbundenen Overhead meinst Du? Es muss .Net Framework 2 installiert sein
(was heut zu tage eh schon Standart ist und auf jedem Rechner läuft oder sich automatisiert installieren lässt, und dann kann PS als einfaches Windows Update nachinstalliert werden in Netzwerken über autom Softwareverteilung .. jetzt auch wsus usw. sogar die execution-policy kann über Gruppenrichtlinien vorgegeben werden) Also dort von einem Overhead bezügl der Installation zu sprechen finde ich reichlich überzogen.

Ausserdem sollte eine vorgeschlagene Lösung doch in
möglichst vielen Umgebungen laufen können ohne irgendwelche
Voraussetzungen zu machen.

Weist DU wieviel Umgebungen er hat?
Deshalb habe ich ja gefragt.

Gruß
LotPings
Mitglied: 77559
77559 Apr 26, 2009 at 10:24:51 (UTC)
Goto Top
Zitat von @Scroller:

Weist DU wieviel Umgebungen er hat?
Deshalb habe ich ja gefragt.
Nein, und deshalb habe ich eine Lösung angeboten die sehr wahrscheinlich in seiner Umgebung funktioniert.
Member: Lionheart
Lionheart Apr 27, 2009 at 08:27:24 (UTC)
Goto Top
Schon einmal vielen Dank für eure Antworten - bevor es jedoch an das Löschen der Tagesordner geht, steh ich momentan noch vor einem anderen Problem.

Die Verzeichnisse mit dem Tagesdatum erstelle ich mit folgenden Befehlszeilen:

MD "c:\Transfer\Archiv\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"
XCOPY "c:\Transfer\*.*" "c:\Transfer\Archiv\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%\" /E /Y

Soweit so gut, nun muss ich jedoch zunächst einmal das Verzeichnis c:\Transfer bereinigen, so dass alle Dateien und Unterverzeichnisse mit Ausnahme von c:\Transfer\Archiv entfernt werden.

Da es sich bei c:\Transfer um ein freigegebenes Verzeichnis handelt, kann ich dieses Verzeichnis nicht einfach per RMDIR löschen. Mit "DEL *.*" werden nur die Dateien, aber keine Unterverzeichnisse entfernt.

Wie bekomm ich c:\Transfer bereinigt, ohne das Verzeichnis \Archiv zu löschen?
Mitglied: 77559
77559 Apr 27, 2009 at 09:04:04 (UTC)
Goto Top
Im Explorer alles bis auf Archiv markieren und löschen/verschieben?
Man kann manche (und vor alle m einmalige) Dinge auf noch zu Fuß erledigen.

Gruß
LotPings
Member: Lionheart
Lionheart Apr 27, 2009 at 09:10:48 (UTC)
Goto Top
@77559
Es geht hierbei ja um keine einmalige Sache. Das Skript soll doch täglich das Verzeichnis c:\Transfer bereinigen und die darin enthaltenen Dateien und Unterverzeichnisse nach c:\Transfer\Archiv\JJJJMMTT verschieben.

Da ich mit MOVE nicht arbeiten kann, da ich damit zwar die enthaltenen Dateien, aber nicht die Unterverzeichnisse mit variabler Bezeichnung verschieben kann, muss ich mit einer XCOPY- und Bereinigen-Lösung arbeiten.

Das Bereinigen gestaltet sich hierbei jedoch umständlicher als geplant, da DEL nur Dateien löscht und RMDIR nicht mit variablen Ordnernamen arbeiten kann.
Mitglied: 77559
77559 Apr 27, 2009 at 09:26:10 (UTC)
Goto Top
@echo off
set "Ziel=C:\Transfer\Archiv\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"  
MD "Ziel"  
Pushd "C:\Transfer"  
for /f "delims=" %%A in ('dir /B/A *^|find /I /V "Archiv"') do MOVE "%%A" "%Ziel%\"  
popd
Member: Lionheart
Lionheart Apr 27, 2009 at 09:48:22 (UTC)
Goto Top
@77559
Thanx! Ich musste zwar noch eine Kleinigkeit ändern, aber mit folgendem Skript bekomme ich das Verzeichnis nach meinen Vorstellungen bereinigt.

@echo off
md "c:\Transfer\Archiv\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"
set "Ziel=C:\Transfer\Archiv\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"
Pushd "C:\Transfer"
for /f "delims=" %%A in ('dir /B/A *^|find /I /V "Archiv"') do MOVE "%%A" "%Ziel%\"
popd

Bei deiner Zeile 03 hat er immer das Verzeichnis c:\Ziel angelegt. Durch die Umstellung von mir (Zeile 01) funktioniert das Skript nun wie gewünscht.

Jetzt geht es nur noch darum, die alten Ordner unter \Archiv zu entfernen. face-smile
Mitglied: 77559
77559 Apr 27, 2009 at 11:07:09 (UTC)
Goto Top
Zitat von @Lionheart:
@77559
Thanx! Ich musste zwar noch eine Kleinigkeit ändern, aber mit folgendem Skript bekomme ich das Verzeichnis nach meinen Vorstellungen bereinigt.

Bei deiner Zeile 03 hat er immer das Verzeichnis c:\Ziel angelegt.
Fehler passieren auch mir, da fehlen nur die %-Zeichen.

Durch die Umstellung von mir (Zeile 01) funktioniert das Skript nun wie gewünscht.

Jetzt geht es nur noch darum, die alten Ordner unter \Archiv zu entfernen. face-smile

Das hatten wir doch schon!

@echo off
set "Ziel=C:\Transfer\Archiv\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"  
MD "%Ziel%"  
Pushd "C:\Transfer"  
for /f "delims=" %%A in ('dir /B/A *^|find /I /V "Archiv"') do echo MOVE "%%A" "%Ziel%\"  
for /f "skip=7 delims=" %%A in ('dir /B /AD /O-N Archiv\20* ^|findstr "^[0-9]*$" ') do echo RD /Q /S "%%~fA"  
popd

Die echos sind noch mal drin; teste erst nochmal

Gruß
LotPings

[Edit] In Zeile 6 fehlendes " eingefügt.[/Edit]
Member: Lionheart
Lionheart Apr 27, 2009 at 12:24:03 (UTC)
Goto Top
Ich habe es jetzt mal so übernommen, das Verschieben funktioniert weiterhin. Das Löschen dagegen nicht. Bezieht sich die Abfrage auf das Erstelldatum oder auf die Ordnerbezeichnung?

Obwohl ich den Schalter @echo on aktiviert habe, bekomme ich in der CMD keine Verzeichnisse angezeigt.
Mitglied: 77559
77559 Apr 27, 2009 at 14:20:38 (UTC)
Goto Top
Zitat von @Lionheart:
Ich habe es jetzt mal so übernommen, das Verschieben funktioniert
weiterhin. Das Löschen dagegen nicht. Bezieht sich die Abfrage
auf das Erstelldatum oder auf die Ordnerbezeichnung?

Wie früher schon mal erwähnt auf die Ordnerbezeichnung die ja selber chronologisch sortiert ist.
siehe DIR /?
Obwohl ich den Schalter @echo on aktiviert habe, bekomme ich in der CMD keine Verzeichnisse angezeigt.

Das ist nicht Sinnvoll.
Echo off 
Unterdrückt die Ausgabe der ausgeführten Befehlszeilen (echo on ist nur zum debuggen)
Die zweite for Zeile gibt nur die Verzeichnisse aus die gelöscht würden wenn es denn mehr als 7 sind, sonst kommt da ja auch nichts.

du kannst testhalber im cmd Fenster ein paar Verzeichnisse erzeugen mit:
for /l %A in (401 1 420) do MD "C:\Transfer\Archiv\20090%A"  

Damit der Batch richtig arbeitet muss das echo zwischen DO und Move bzw. RD raausgenommen werden.

Gruß
LotPings
Member: Lionheart
Lionheart Apr 27, 2009 at 14:42:37 (UTC)
Goto Top
Danke.

for /f "skip=7 delims=" %A in ('dir /B /AD /O-N Archiv\20* ^|findstr "^[0-9]*$') do echo RD /Q /S "%%~fA"

Führe ich zum Test die Zeile zum Entfernen der Verzeichnisse aus, zeigt mir die Kommandozeile einfach "Mehr?" an. Zu löschende Verzeichnisse erhalte ich keine.

Was hat das zu bedeuten?
Mitglied: 77559
77559 Apr 27, 2009 at 15:00:55 (UTC)
Goto Top
Du hastscheinbar eine Schwäche beim übertragen von Beispielen face-sad
Die %Zeichen von Schleifen-Variablen müssen verdoppelt sein,

for /f "skip=7 delims=" %A in ('dir /B /AD /O-N Archiv\20* ^|findstr "^[0-9]*$') do echo RD /Q /S "%%~fA"

Steht so NICHT in meinem Beitrag, sondern:

for /f "skip=7 delims=" %%A in ('dir /B /AD /O-N Archiv\20* ^|findstr "^[0-9]*$') do echo RD /Q /S "%%~fA"   

Klicke im Code Fenster auf Quelltext und kopiere über die Zwischenablage, dann gibt es weniger Übertragungsfehler.
(Meine Finger schmerzen jetzt etwas vom intensiven Händchenhalten face-wink )

Gruß
LotPings
Member: Biber
Biber Apr 27, 2009 at 15:02:13 (UTC)
Goto Top
Moin Lionheart,

Was hat das zu bedeuten?
Es bedeutet, dass die Befehlszeile nach Ansicht des CMD-Interpreters noch unvollständig ist.
Und das hängt meist mit einer unpaarigen Anzahl von öffnenden und schließenden Anführungszeichen zusammen.
In Deinem Fall fehlt eines nach dem $-Zeichen des FindStr-Parameters "^[0-9]${hier!}'.

Grüße
Biber
Mitglied: 77559
77559 Apr 27, 2009 at 15:15:02 (UTC)
Goto Top
Danke Biber,
nach dem Entdecken eines zusätzlich eingebauten Fehlers hab ich meinen Fehler aus Betriebsblindheit nicht gesehen face-sad
Mea Culpa Lionheart.
Member: Lionheart
Lionheart Apr 27, 2009 at 15:29:36 (UTC)
Goto Top
@Biber
Danke! face-smile

@logpings
Ich weiß das ich mich grad nicht wirklich geschickt anstelle, aber Batch-Programmierung ist für mich absolutes Neuland. Dir aber schon einmal vielen Dank auch für das intensive Händchenhalten. ;)

Wir sind auf einem guten Weg. Lediglich der Befehl RD wird im falschen Verzeichnis ausgeführt. Er prüft die Verzeichnisse unter c:\transfer\archiv möchte sie aber unter c:\transfer entfernen. face-smile
Mitglied: 77559
77559 Apr 27, 2009 at 15:42:53 (UTC)
Goto Top
Zitat von @Lionheart:

Wir sind auf einem guten Weg. Lediglich der Befehl RD wird im falschen Verzeichnis ausgeführt. Er prüft die Verzeichnisse unter c:\transfer\archiv möchte sie aber unter c:\transfer entfernen. face-smile

Dir /B ohne /S hat bei relativen Pfaden manchmal diesen Effekt face-sad
@echo off
set "Ziel=C:\Transfer\Archiv\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"  
MD "%Ziel%"  
Pushd "C:\Transfer"  
for /f "delims=" %%A in ('dir /B/A *^|find /I /V "Archiv"') do echo MOVE "%%A" "%Ziel%\"  
CD "C:\Transfer\Archiv"  
for /f "skip=7 delims=" %%A in ('dir /B /AD /O-N 20* ^|findstr "^[0-9]*$" ') do echo RD /Q /S "%%~fA"  
popd

Geht's so?
Member: Lionheart
Lionheart Apr 27, 2009 at 16:02:39 (UTC)
Goto Top
Jupp, es funktioniert! LotPings du bist mein persönlicher Held der Woche... face-smile

Vielen DANK!!!!
Mitglied: 77559
77559 Apr 27, 2009 at 16:10:51 (UTC)
Goto Top
Zitat von @Lionheart:
Jupp, es funktioniert! LotPings du bist mein persönlicher Held
der Woche... face-smile

Vielen DANK!!!!

Na Super,
Hand ausschüttel face-wink

Dann kannst Du das ja als Erledigt markieren und ich geh jetzt ein Bier trinken. face-smile