Dateien nach Datum automatisch archivieren
Dateien die älter wie 3 Monate sind moven und dann löschen
Hallo Leute,
Ich möchte Dateien mit bestimmten Endungen aus einem Verzeichnis die älter als 3 Monate sind in einen anderen Ordner moven (oder kopieren und danach am Ursprung löschen).
Ich hab jetz mal hier etwas rumgesucht und einige brauchbare "fetzen" Code gefunden, allerdings scheieert es am Zusammenbau dieser
am besten gefiele mir diese Routine:
@echo off
for /F "delims=. tokens=2" %%B in ("%date%") do Set "MON=%%B"
If [%MON%]==[01] SET "VMN=10"
If [%MON%]==[02] SET "VMN=11"
If [%MON%]==[03] SET "VMN=12"
If [%MON%]==[04] SET "VMN=01"
If [%MON%]==[05] SET "VMN=02"
If [%MON%]==[06] SET "VMN=03"
If [%MON%]==[07] SET "VMN=04"
If [%MON%]==[08] SET "VMN=05"
If [%MON%]==[09] SET "VMN=06"
If [%MON%]==[10] SET "VMN=07"
If [%MON%]==[11] SET "VMN=08"
If [%MON%]==[12] SET "VMN=09"
SET AJR=%DATE:~-4%
SET /A VJR=%AJR% -1
echo %mon% Monat
echo %vmn% Vormonat
echo %ajr% Jahr
echo %vjr% Vorjahr
echo.
REM Zum Ordner mit Vormonat anlegen, das REM in der nächsten Zeile entfernen:
REM md C:\Monat%vmn%
Ich habe die Funktionn auch schon auf meine 3 Monate angepaßt, allerdings habe ich nicht verstanden wie man damit den Jahressprung realisiert!
Beispiel: im Monat "01" sollte das Monat "10" gesichert werden, allerdings DES VORJAHRES!!
Weiters habe ich noch nicht rausgefunden wie man per Variable das Filedatum abprüft ?
Beispiel:
Im Ordner "C:\source" sind viele Dateien
ich möchte nun wenn das Batch im Monat 11 gestartet wird daß alle Dateien die älter wie 3 Monate sind in einen entsprechenden Zielordner kopiert werden
z.B.
Dateien vom Monat 09_2007 in "c:\2007_09
Dateien vom Monat 10_2007 in "c:\2007_10
u.s.w ...
Die Ordner sollten automatisch erstellt werden!
Geht das überhaupt per Batch???
Wenn ja, hat jemand einen Tip??
Hallo Leute,
Ich möchte Dateien mit bestimmten Endungen aus einem Verzeichnis die älter als 3 Monate sind in einen anderen Ordner moven (oder kopieren und danach am Ursprung löschen).
Ich hab jetz mal hier etwas rumgesucht und einige brauchbare "fetzen" Code gefunden, allerdings scheieert es am Zusammenbau dieser
am besten gefiele mir diese Routine:
@echo off
for /F "delims=. tokens=2" %%B in ("%date%") do Set "MON=%%B"
If [%MON%]==[01] SET "VMN=10"
If [%MON%]==[02] SET "VMN=11"
If [%MON%]==[03] SET "VMN=12"
If [%MON%]==[04] SET "VMN=01"
If [%MON%]==[05] SET "VMN=02"
If [%MON%]==[06] SET "VMN=03"
If [%MON%]==[07] SET "VMN=04"
If [%MON%]==[08] SET "VMN=05"
If [%MON%]==[09] SET "VMN=06"
If [%MON%]==[10] SET "VMN=07"
If [%MON%]==[11] SET "VMN=08"
If [%MON%]==[12] SET "VMN=09"
SET AJR=%DATE:~-4%
SET /A VJR=%AJR% -1
echo %mon% Monat
echo %vmn% Vormonat
echo %ajr% Jahr
echo %vjr% Vorjahr
echo.
REM Zum Ordner mit Vormonat anlegen, das REM in der nächsten Zeile entfernen:
REM md C:\Monat%vmn%
Ich habe die Funktionn auch schon auf meine 3 Monate angepaßt, allerdings habe ich nicht verstanden wie man damit den Jahressprung realisiert!
Beispiel: im Monat "01" sollte das Monat "10" gesichert werden, allerdings DES VORJAHRES!!
Weiters habe ich noch nicht rausgefunden wie man per Variable das Filedatum abprüft ?
Beispiel:
Im Ordner "C:\source" sind viele Dateien
ich möchte nun wenn das Batch im Monat 11 gestartet wird daß alle Dateien die älter wie 3 Monate sind in einen entsprechenden Zielordner kopiert werden
z.B.
Dateien vom Monat 09_2007 in "c:\2007_09
Dateien vom Monat 10_2007 in "c:\2007_10
u.s.w ...
Die Ordner sollten automatisch erstellt werden!
Geht das überhaupt per Batch???
Wenn ja, hat jemand einen Tip??
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 74102
Url: https://administrator.de/contentid/74102
Ausgedruckt am: 08.11.2024 um 07:11 Uhr
14 Kommentare
Neuester Kommentar
Hallo pbelcl!
Da Du ja schon %MON% und %VMN% sowie %AJR% und %VJR% hast, kann der Ordnername so bestimmt werden:
Vor dem Kopieren solltest Du natürlich den Ordner schon erstellt haben, daher:
Das Dateidatum kannst Du so auslesen (Beispiele für Batch, an der Kommandozeile jeweils nur ein "%"):
Um nur das Monat zu erhalten:
Nur Dateien aus dem Monat %VMN% zu kopieren ginge dann mit:
Das "@echo" vor dem "copy" dient dazu, nur einmal das Kopieren zu simulieren - wenn Du es entfernst, wird tatsächlich kopiert.
Grüße
bastla
Da Du ja schon %MON% und %VMN% sowie %AJR% und %VJR% hast, kann der Ordnername so bestimmt werden:
if %MON% gtr %VMN% (set Ordner=C:\%AJR%_%VMN%) else set Ordner=C:\%VJR%_%VMN%
Vor dem Kopieren solltest Du natürlich den Ordner schon erstellt haben, daher:
if not exist %Ordner% md %Ordner%
Das Dateidatum kannst Du so auslesen (Beispiele für Batch, an der Kommandozeile jeweils nur ein "%"):
for %%i in (C:\source\*.*) do echo %%i vom %%~ti
for %%i in (C:\source\*.*) do for /f "tokens=2 delims=." %%m in ('echo %%~ti') do echo %%i aus Monat %%m
for %%i in (C:\source\*.*) do for /f "tokens=2 delims=." %%m in ('echo %%~ti') do if %%m==%VMN% @echo copy "%%i" %Ordner%\
Grüße
bastla
@bastla
Sind nicht die Monatsnamen auf ~i (Mai, Juni, Juli) weiblich?
Und April ist doch auch ein weiblicher Name, oder?
Grüße
Biber
Um nur das Monat zu erhalten:
Das Monat?Sind nicht die Monatsnamen auf ~i (Mai, Juni, Juli) weiblich?
Und April ist doch auch ein weiblicher Name, oder?
Grüße
Biber
@Biber
Eben, eben - damit sich die anderen (mehrheitlich miese männliche Mimosen) durch das eigentlich korrekte "die" nicht benachteiligt fühlen, als Kompromisslösung "das" ...
Grüße
bastla
Eben, eben - damit sich die anderen (mehrheitlich miese männliche Mimosen) durch das eigentlich korrekte "die" nicht benachteiligt fühlen, als Kompromisslösung "das" ...
Grüße
bastla
Hallo pbelcl!
Damit wir auf den gleichen Stand kommen:
Aus Gründen der Übersichtlichkeit habe ich Quelle und Zielordner (bitte ohne abschließenden "\" belassen) am Anfang in Variable gepackt und zur Sicherheit noch einige Anführungszeichen (an hoffentlich passenden Stellen ) hinzugefügt.
Das an den "copy"-Befehl angefügte ">nul" dient dem Unterdrücken der entbehrlichen Meldung "1 Datei(en) kopiert." und war für die unten dargestellte Ausgabe noch nicht vorhanden - daher bitte beim Testen noch weglassen.
Mit obigem Code erhalte ich eine Anzeige der Art
bzw werden nach dem Entfernen des "@echo" die entsprechenden Kopiervorgänge vorgenommen.
Grüße
bastla
[Edit] Hinweis auf Verwendung von ">nul" hinzugefügt. [/Edit]
Damit wir auf den gleichen Stand kommen:
@echo off & setlocal
set "Quelle=C:\source\*.*"
set "Ziel=C:"
for /F "delims=. tokens=2" %%B in ("%date%") do set "MON=%%B"
If [%MON%]==[01] SET "VMN=10"
If [%MON%]==[02] SET "VMN=11"
If [%MON%]==[03] SET "VMN=12"
If [%MON%]==[04] SET "VMN=01"
If [%MON%]==[05] SET "VMN=02"
If [%MON%]==[06] SET "VMN=03"
If [%MON%]==[07] SET "VMN=04"
If [%MON%]==[08] SET "VMN=05"
If [%MON%]==[09] SET "VMN=06"
If [%MON%]==[10] SET "VMN=07"
If [%MON%]==[11] SET "VMN=08"
If [%MON%]==[12] SET "VMN=09"
SET AJR=%DATE:~-4%
SET /A VJR=%AJR%-1
if %MON% gtr %VMN% (set "Ordner=%Ziel%\%AJR%_%VMN%") else set "Ordner=%Ziel%\%VJR%_%VMN%"
if not exist "%Ordner%" md "%Ordner%"
for %%i in ("%Quelle%") do for /f "tokens=2 delims=." %%m in ('echo %%~ti') do if %%m==%VMN% @echo copy "%%i" "%Ordner%\" >nul
Das an den "copy"-Befehl angefügte ">nul" dient dem Unterdrücken der entbehrlichen Meldung "1 Datei(en) kopiert." und war für die unten dargestellte Ausgabe noch nicht vorhanden - daher bitte beim Testen noch weglassen.
Mit obigem Code erhalte ich eine Anzeige der Art
copy "C:\source\CSV2XLS2.vbs" "C:\2007_08\"
copy "C:\source\CSV2XLS1.csv" "C:\2007_08\"
copy "C:\source\CSV2XLS1.vbs" "C:\2007_08\"
copy "C:\source\CSV2XLS.vbs" "C:\2007_08\"
copy "C:\source\CSV2XLS.csv" "C:\2007_08\"
Grüße
bastla
[Edit] Hinweis auf Verwendung von ">nul" hinzugefügt. [/Edit]
Hallo pbelcl!
Mit der von Dir verwendeten Quellenangabe
kann das natürlich nicht klappen - versuch es mit
Ob aus dem Ordner "Papierkorb.sys" Dateien per Batch ausgelesen werden können, kannst Du mit einem einfachen
direkt an der Kommandozeile überprüfen - sollte auch gehen, wenn dieser Ordner tatsächlich "hidden" ist (und bleiben soll). Auf jeden Fall müsste aber ein
dessen Inhalte zutage fördern.
Umlaute und Batch sind so eine Sache für sich - falls meine Standardempfehlung "Vermeiden!" für Dich nicht in Frage kommt, gäbe es immer noch die Möglichkeit, den Batch mit dem CMD-Editor zu bearbeiten - hatten wir kürzlich hier.
Grüße
bastla
Mit der von Dir verwendeten Quellenangabe
set "Quelle=set source=p:\arube\Nachrichten\Papierkorb.sys\*.*"
set "Quelle=p:\arube\Nachrichten\Papierkorb.sys\*.*"
dir p:\arube\Nachrichten\Papierkorb.sys\*.*
dir /aa p:\arube\Nachrichten\Papierkorb.sys\*.*
Umlaute und Batch sind so eine Sache für sich - falls meine Standardempfehlung "Vermeiden!" für Dich nicht in Frage kommt, gäbe es immer noch die Möglichkeit, den Batch mit dem CMD-Editor zu bearbeiten - hatten wir kürzlich hier.
Grüße
bastla
Hallo pbelcl!
Machbar wäre das etwa so:
In diesem Fall würde ich den "xcopy"-Befehl wegen seines Schalters "/d" bevorzugen - damit werden nur neuere Dateien kopiert, was aufgrund der Tatsache, dass jetzt ja immer alle Dateien des Quellverzeichnisses berücksichtigt werden, IMHO geboten scheint.
Der Kopiervorgang wird in einer (jedesmal neu erstellten) Protokolldatei "L:\CopyLog.txt" dokumentiert. Beim Kopieren eventuell auftretende Fehler werden ebenfalls in diese Logdatei geschrieben.
Grüße
bastla
P.S.: Mehr zu "xcopy" erfährst Du mit "xcopy /?" ...
[Edit] Um Fehler beim Kopieren in ihrem Kontext darzustellen, erfolgt jetzt die Protokollierung so, dass sämtliche Ausgaben in "L:\CopyLog.txt" geschrieben werden. [/Edit]
Machbar wäre das etwa so:
@echo off & setlocal
set "Quelle=p:\arube\Nachrichten\Papierkorb.sys\*.*"
set "Ziel=L:\X_Muell"
set "Log=L:\CopyLog.txt"
if exist "%Log%" del "%Log%"
for %%i in ("%Quelle%") do for /f "tokens=2,3 delims=. " %%a in ('echo %%~ti') do (
if not exist "%Ziel%\%%b_%%a" md "%Ziel%\%%b_%%a"
xcopy /d /h /r /c /y "%%i" "%Ziel%\%%b_%%a\">>"%Log%" 2>&1
)
Der Kopiervorgang wird in einer (jedesmal neu erstellten) Protokolldatei "L:\CopyLog.txt" dokumentiert. Beim Kopieren eventuell auftretende Fehler werden ebenfalls in diese Logdatei geschrieben.
Grüße
bastla
P.S.: Mehr zu "xcopy" erfährst Du mit "xcopy /?" ...
[Edit] Um Fehler beim Kopieren in ihrem Kontext darzustellen, erfolgt jetzt die Protokollierung so, dass sämtliche Ausgaben in "L:\CopyLog.txt" geschrieben werden. [/Edit]
Hallo pbelcl!
ad 1.)
Auch ich hatte den letzten Satz der Online-Hilfe zu "move" lange Zeit überlesen ...
Was übrigens auch in Batch beachtet wird, ist "/-Y" - dann wird auf jeden Fall die Bestätigung für das Überschreiben verlangt (was aber natürlich nur bei interaktivem Start des Batches sinnvoll sein kann). Im Fall des Falles kannst Du aber ein "if not exist Zieldatei move ..." verwenden, damit auch aus einem Batch heraus nicht überschrieben wird.
ad 2.)
Für die Anzeige/das Loggen der verschobenen Dateien musst Du selbst sorgen, etwa so:
Durch die Verknüpfung mit "&&" wird der Logeintrag nur erstellt, wenn der "move"-Befehl ohne Fehler beendet wurde.
Um übrigens Fehlermeldungen umzuleiten, müsstest Du "2>>Umleitungsziel" verwenden, da diese Meldungen auf dem Kanal 2 (STDERROR) ausgegeben werden.
Sollen Fehlermeldungen und "normale" Meldungen aus Kanal 1 (STDOUT) in die selbe Datei geschrieben werden, wäre die Schreibweise ">>Umleitungsziel 2>>&1" zu verwenden, da bei einem ">>Umleitungsziel 2>>Umleitungsziel" die Zieldatei während der Ausführung des Befehles zweimal zum Schreiben geöffnet werden müsste, was nicht zulässig ist.
Grüße
bastla
ad 1.)
Auch ich hatte den letzten Satz der Online-Hilfe zu "move" lange Zeit überlesen ...
Was übrigens auch in Batch beachtet wird, ist "/-Y" - dann wird auf jeden Fall die Bestätigung für das Überschreiben verlangt (was aber natürlich nur bei interaktivem Start des Batches sinnvoll sein kann). Im Fall des Falles kannst Du aber ein "if not exist Zieldatei move ..." verwenden, damit auch aus einem Batch heraus nicht überschrieben wird.
ad 2.)
Für die Anzeige/das Loggen der verschobenen Dateien musst Du selbst sorgen, etwa so:
for %%i in ("%Quelle%") do for /f "tokens=2 delims=." %%m in ('echo %%~ti') do if %%m==%VMN% move "%%i" "%Ordner%\" && echo Verschoben: %%i >>%~n0.log
Passiert das nur wenn ein Fehler auftritt?
Oder habe ich das mit der Umleitung ">>" falsch verstanden?
Die Umleitung mit ">>" wäre schon OK, wenn, so wie beim "xcopy", der "move"-Befehl eine Ausgabe erzeugte. (BTW: Der "copy"-Befehl liefert zwar eine Ausgabe, aber da diese nur zB "1 Datei(en) kopiert" lautet, leite ich sie grundsätzlich nach "nul" um).Oder habe ich das mit der Umleitung ">>" falsch verstanden?
Um übrigens Fehlermeldungen umzuleiten, müsstest Du "2>>Umleitungsziel" verwenden, da diese Meldungen auf dem Kanal 2 (STDERROR) ausgegeben werden.
Sollen Fehlermeldungen und "normale" Meldungen aus Kanal 1 (STDOUT) in die selbe Datei geschrieben werden, wäre die Schreibweise ">>Umleitungsziel 2>>&1" zu verwenden, da bei einem ">>Umleitungsziel 2>>Umleitungsziel" die Zieldatei während der Ausführung des Befehles zweimal zum Schreiben geöffnet werden müsste, was nicht zulässig ist.
Grüße
bastla