Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Verzeichnisse nach Datum löschen

Frage Entwicklung Batch & Shell

Mitglied: Lionheart

Lionheart (Level 1) - Jetzt verbinden

24.04.2009, aktualisiert 09:05 Uhr, 8884 Aufrufe, 24 Kommentare

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.
Mitglied: Scroller
24.04.2009 um 13:17 Uhr
hi,

kannst du dort Powershell verwenden?
Das wäre einfacher
gruss scroller
Bitte warten ..
Mitglied: LotPings
24.04.2009 um 14:17 Uhr
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.
01.
@echo off 
02.
pushd "DeinAustauschOrdner" 
03.
for /f "skip=7 delims=" %%A in ('dir /B /AD /O-N 20* ^|findstr "^[0-9]*$') do echo RD /Q /S  "%%A" 
04.
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
Bitte warten ..
Mitglied: LotPings
24.04.2009 um 14:27 Uhr
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
Bitte warten ..
Mitglied: Biber
24.04.2009 um 14:29 Uhr
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
01.
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]
Bitte warten ..
Mitglied: LotPings
24.04.2009 um 15:20 Uhr
Zitat von Biber:
01.
FOR /f  "skip=7" %i IN ('dir /AD /b /s /o-d X:\Austausch\20??????') DO @echo RD /s /q %~fi 
02.
> 
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

Gruß
LotPings
Bitte warten ..
Mitglied: Biber
24.04.2009 um 16:28 Uhr
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
Bitte warten ..
Mitglied: Scroller
26.04.2009 um 11:30 Uhr
Zitat von LotPings:

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
Bitte warten ..
Mitglied: LotPings
26.04.2009 um 12:24 Uhr
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.
Bitte warten ..
Mitglied: Lionheart
27.04.2009 um 10:27 Uhr
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?
Bitte warten ..
Mitglied: LotPings
27.04.2009 um 11:04 Uhr
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
Bitte warten ..
Mitglied: Lionheart
27.04.2009 um 11:10 Uhr
@LotPings
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.
Bitte warten ..
Mitglied: LotPings
27.04.2009 um 11:26 Uhr
01.
@echo off 
02.
set "Ziel=C:\Transfer\Archiv\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%" 
03.
MD "Ziel" 
04.
Pushd "C:\Transfer" 
05.
for /f "delims=" %%A in ('dir /B/A *^|find /I /V "Archiv"') do MOVE "%%A" "%Ziel%\" 
06.
popd
Bitte warten ..
Mitglied: Lionheart
27.04.2009 um 11:48 Uhr
@LotPings
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.
Bitte warten ..
Mitglied: LotPings
27.04.2009 um 13:07 Uhr
Zitat von Lionheart:
@LotPings
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.

Das hatten wir doch schon!

01.
@echo off 
02.
set "Ziel=C:\Transfer\Archiv\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%" 
03.
MD "%Ziel%" 
04.
Pushd "C:\Transfer" 
05.
for /f "delims=" %%A in ('dir /B/A *^|find /I /V "Archiv"') do echo MOVE "%%A" "%Ziel%\" 
06.
for /f "skip=7 delims=" %%A in ('dir /B /AD /O-N Archiv\20* ^|findstr "^[0-9]*$" ') do echo RD /Q /S "%%~fA" 
07.
popd
Die echos sind noch mal drin; teste erst nochmal

Gruß
LotPings

[Edit] In Zeile 6 fehlendes " eingefügt.[/Edit]
Bitte warten ..
Mitglied: Lionheart
27.04.2009 um 14:24 Uhr
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.
Bitte warten ..
Mitglied: LotPings
27.04.2009 um 16:20 Uhr
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:
01.
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
Bitte warten ..
Mitglied: Lionheart
27.04.2009 um 16:42 Uhr
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?
Bitte warten ..
Mitglied: LotPings
27.04.2009 um 17:00 Uhr
Du hastscheinbar eine Schwäche beim übertragen von Beispielen
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:

01.
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
Bitte warten ..
Mitglied: Biber
27.04.2009 um 17:02 Uhr
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
Bitte warten ..
Mitglied: LotPings
27.04.2009 um 17:15 Uhr
Danke Biber,
nach dem Entdecken eines zusätzlich eingebauten Fehlers hab ich meinen Fehler aus Betriebsblindheit nicht gesehen
Mea Culpa Lionheart.
Bitte warten ..
Mitglied: Lionheart
27.04.2009 um 17:29 Uhr
@Biber
Danke!

@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.
Bitte warten ..
Mitglied: LotPings
27.04.2009 um 17:42 Uhr
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.

Dir /B ohne /S hat bei relativen Pfaden manchmal diesen Effekt
01.
@echo off 
02.
set "Ziel=C:\Transfer\Archiv\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%" 
03.
MD "%Ziel%" 
04.
Pushd "C:\Transfer" 
05.
for /f "delims=" %%A in ('dir /B/A *^|find /I /V "Archiv"') do echo MOVE "%%A" "%Ziel%\" 
06.
CD "C:\Transfer\Archiv" 
07.
for /f "skip=7 delims=" %%A in ('dir /B /AD /O-N 20* ^|findstr "^[0-9]*$" ') do echo RD /Q /S "%%~fA" 
08.
popd
Geht's so?
Bitte warten ..
Mitglied: Lionheart
27.04.2009 um 18:02 Uhr
Jupp, es funktioniert! LotPings du bist mein persönlicher Held der Woche...

Vielen DANK!!!!
Bitte warten ..
Mitglied: LotPings
27.04.2009 um 18:10 Uhr
Zitat von Lionheart:
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.
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
Bestimmte Verzeichnisse löschen via Powershell (8)

Frage von killtec zum Thema Batch & Shell ...

Datenbanken
gelöst SQL-Abfrage - DISTINCT - letztes Datum (3)

Frage von emeriks zum Thema Datenbanken ...

Exchange Server
Exchange 2010 Akzeptierte Domäne löschen (4)

Frage von Rob1982 zum Thema Exchange Server ...

Exchange Server
gelöst SBS2011 - im Exchange mobile Geräte löschen (4)

Frage von MiSt zum Thema Exchange Server ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (17)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...