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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 114572
Url: https://administrator.de/contentid/114572
Ausgedruckt am: 25.11.2024 um 21:11 Uhr
24 Kommentare
Neuester Kommentar
Hallo Lionheart.
Wenn keine anderen Ordner da sind (mit ählicher Datumsstruktur) brauchst du das gar nicht.
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
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
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
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
Moin 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
Diese Zeile am CMD-Prompt zeigt an, welche Unterzeichnisse gelöscht werden würden.
Grüße
Biber
[Edit] Uups, viel zu langsam.....[/Edit]
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]
Zitat von @Biber:
Hallo Biber, Wenn jemand in den Tagesverzeichnissen etwas ändert, ändert sich auch das Ordnerdatum, ich würde also lieber nach dem Namen sortieren.FOR /f "skip=7" %i IN ('dir /AD /b /s /o-d X:\Austausch\20??????') DO @echo RD /s /q %~fi
>
[Edit] Uups, viel zu langsam.....[/Edit]
Viel halte ich für übertrieben Gruß
LotPings
Moin LotPings,
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
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
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
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.
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
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.Deshalb habe ich ja gefragt.
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
Man kann manche (und vor alle m einmalige) Dinge auf noch zu Fuß erledigen.
Gruß
LotPings
@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
Zitat von @Lionheart:
@77559
Thanx! Ich musste zwar noch eine Kleinigkeit ändern, aber mit folgendem Skript bekomme ich das Verzeichnis nach meinen Vorstellungen bereinigt.
@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.
Jetzt geht es nur noch darum, die alten Ordner unter \Archiv zu entfernen.
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]
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.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?
siehe DIR /?
Obwohl ich den Schalter @echo on aktiviert habe, bekomme ich in der CMD keine Verzeichnisse angezeigt.
Das ist nicht Sinnvoll.
Echo off
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
Du hastscheinbar eine Schwäche beim übertragen von Beispielen
Die %Zeichen von Schleifen-Variablen müssen verdoppelt sein,
Steht so NICHT in meinem Beitrag, sondern:
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 )
Gruß
LotPings
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 )
Gruß
LotPings
Moin Lionheart,
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
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
Danke Biber,
nach dem Entdecken eines zusätzlich eingebauten Fehlers hab ich meinen Fehler aus Betriebsblindheit nicht gesehen
Mea Culpa Lionheart.
nach dem Entdecken eines zusätzlich eingebauten Fehlers hab ich meinen Fehler aus Betriebsblindheit nicht gesehen
Mea Culpa 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.
Dir /B ohne /S hat bei relativen Pfaden manchmal diesen Effekt
@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?
Zitat von @Lionheart:
Jupp, es funktioniert! LotPings du bist mein persönlicher Held
der Woche...
Vielen DANK!!!!
Jupp, es funktioniert! LotPings du bist mein persönlicher Held
der Woche...
Vielen DANK!!!!
Na Super,
Hand ausschüttel
Dann kannst Du das ja als Erledigt markieren und ich geh jetzt ein Bier trinken.