pbelcl
Goto Top

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 dieserface-wink

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??

Content-ID: 74102

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

Ausgedruckt am: 08.11.2024 um 07:11 Uhr

bastla
bastla 21.11.2007 um 13:25:59 Uhr
Goto Top
Hallo pbelcl!

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
Um nur das Monat zu erhalten:
for %%i in (C:\source\*.*) do for /f "tokens=2 delims=." %%m in ('echo %%~ti') do echo %%i aus Monat %%m  
Nur Dateien aus dem Monat %VMN% zu kopieren ginge dann mit:
for %%i in (C:\source\*.*) do for /f "tokens=2 delims=." %%m in ('echo %%~ti') do if %%m==%VMN% @echo copy "%%i" %Ordner%\  
Das "@echo" vor dem "copy" dient dazu, nur einmal das Kopieren zu simulieren - wenn Du es entfernst, wird tatsächlich kopiert.

Grüße
bastla
Biber
Biber 21.11.2007 um 13:54:05 Uhr
Goto Top
@bastla
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
pbelcl
pbelcl 21.11.2007 um 14:01:30 Uhr
Goto Top
WOW!!!
Das ist ja super, werds gleich mal ausprobieren ....
Danke bastla!
bastla
bastla 21.11.2007 um 14:03:04 Uhr
Goto Top
@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" ... face-wink

Grüße
bastla
pbelcl
pbelcl 21.11.2007 um 15:07:01 Uhr
Goto Top
Hallo bastla,

Hab nun alles mal getestet, sieht schon recht gut aus, allerdings hat der Befehl:

Nur Dateien aus dem Monat %VMN% zu kopieren ginge dann mit:
for %%i in (C:\source\*.*) do for /f "tokens=2 delims=." %%m in ('echo %%~ti') do if %%m==%VMN% @echo copy "%%i" %Ordner%\   

in der Augabe mit Echo wird leider nur den Syntax angezeigt und keinen Kopierbefehl!?
Hab ich da was falsch verstanden?

Habe auch versucht den Befehl in ein Logfile umzuleiten, damit ich sehen kann was passieren würde, hat leider auch nicht wirklich geklappt...
Hast Du einen Tip?
bastla
bastla 21.11.2007 um 15:32:01 Uhr
Goto Top
Hallo pbelcl!

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  
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 face-wink) 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
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\"  
bzw werden nach dem Entfernen des "@echo" die entsprechenden Kopiervorgänge vorgenommen.

Grüße
bastla

[Edit] Hinweis auf Verwendung von ">nul" hinzugefügt. [/Edit]
pbelcl
pbelcl 22.11.2007 um 07:45:41 Uhr
Goto Top
Hallo bastla,

Danke für Deine tolle Unterstützung!!
Ich haben gestern abend mein batch weggeworfen und gleich Deines verwendet.
Die Variablen habe ich nun schon so eingetragen wie ich sie brauche.

Das ist das Ergebnis:
rem @echo off 
setlocal

set "Quelle=set source=p:\arube\Nachrichten\Papierkorb.sys\*.*"  
set "Ziel=L:\X_Mull"  

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%\"   

Wenn ich das Echo off oben lasse und das Batch von der Commandline starte sehe ich gar nichts!?

Nachdem ich das Echo ausge"rem"t habe kommt folgende Anzeige:

C:\batch>ac
C:\batch>rem @echo off
C:\batch>setlocal
C:\batch>set "Quelle=set source=p:\arube\Nachrichten\Papierkorb.sys\*.*"
C:\batch>set "Ziel=L:\X_Mull"
C:\batch>for /F "delims=. tokens=2" %B in ("22.11.2007") do set "MON=%B"
C:\batch>set "MON=11"
C:\batch>If [11] == [01] SET "VMN=10"
C:\batch>If [11] == [02] SET "VMN=11"
C:\batch>If [11] == [03] SET "VMN=12"
C:\batch>If [11] == [04] SET "VMN=01"
C:\batch>If [11] == [05] SET "VMN=02"
C:\batch>If [11] == [06] SET "VMN=03"
C:\batch>If [11] == [07] SET "VMN=04"
C:\batch>If [11] == [08] SET "VMN=05"
C:\batch>If [11] == [09] SET "VMN=06"
C:\batch>If [11] == [10] SET "VMN=07"
C:\batch>If [11] == [11] SET "VMN=08"
C:\batch>If [11] == [12] SET "VMN=09"
C:\batch>SET AJR=2007
C:\batch>SET /A VJR=2007-1
C:\batch>if 11 GTR 08 (set "Ordner=L:\X_Mull\2007_08" ) else set "Ordner=L:\X_Mull\2006_08"
C:\batch>if not exist "L:\X_Mull\2007_08" md "L:\X_Mull\2007_08"
C:\batch>for %i in ("set source=p:\arube\Nachrichten\Papierkorb.sys\*.*") do for /F "tokens=2 delims=." %m in ('echo %~ti') do if %m == 08 copy "%i" L:\X_Mull\2007_08\"


Wie man sieht werden die Variablen richtig befüllt und ich habe schon einige mögliche "Fehler" gefunden:

Der Ordner "Papierkorb.sys" war hidden. Hat aber nichts geholfen den auf "normal" zu setzen. -> könnte der hidden bleiben?

Der Ziel-Ordner heißt bei mir "müll". Wenn ich den Umlaut verwende wird ein Ordner mit einem Sonderzeichen erstellt. Hab das zum Test mal umbenannt aber eine Anzeige mit dem schönen copy befehlen wie DU bekomme ich leider immer noch nicht.
Fehlen bei mir vielleicht irgendwelche Systemvariablen oder Routinen die bei Die vorhanden sind??
bastla
bastla 22.11.2007, aktualisiert am 18.10.2012 um 18:32:43 Uhr
Goto Top
Hallo pbelcl!

Mit der von Dir verwendeten Quellenangabe
set "Quelle=set source=p:\arube\Nachrichten\Papierkorb.sys\*.*"  
kann das natürlich nicht klappen - versuch es mit
set "Quelle=p:\arube\Nachrichten\Papierkorb.sys\*.*"  
Ob aus dem Ordner "Papierkorb.sys" Dateien per Batch ausgelesen werden können, kannst Du mit einem einfachen
dir p:\arube\Nachrichten\Papierkorb.sys\*.*
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
dir /aa p:\arube\Nachrichten\Papierkorb.sys\*.*
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
pbelcl
pbelcl 22.11.2007 um 18:09:58 Uhr
Goto Top
Hallo bastla,

Das mit dem falschen SET Befehlt ist fast schon peinlich!!
Habe ich voll übersehen, danke!!

Nach der Korrektur des Fehlers habe ich aml den DIR Befehl probiert. Klappt auch wenn das Verzeichnis Hidden ist, somit sollte es da kein Problem geben.

Nun funktioniert das Ding!!

Nun kommt gleich eine weitere Idee face-wink

Kann man das vollautomatisch auch machen?
Aufgrund des Filedatums die entsprechenden Dateien in den richtigen Monatsordner kopieren?

Dann würde das Batch IMMER wenn es läuft ALLE Dateien vom Monat 11 in den 2007_11 ALLE Dateien vom Monat 01 in den 2007_01 Ordner befördern.

Geht das überhauft?
Wenn ja würde man sich die ganze Variablen Schieberei ersparen ...
bastla
bastla 22.11.2007 um 18:59:26 Uhr
Goto Top
Hallo pbelcl!

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  
)
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]
pbelcl
pbelcl 01.12.2007 um 17:16:22 Uhr
Goto Top
Hallo Bastla,

Die Variante die ALLES kopiert funktioniert nun!
Somit habe ich jetzt mal die Basisdateien der letzten Jahre kopiert, hat mir viel Arbeit gespart!
Nochmal danke für Deine Hilfe!

Ich werde die batch nun noch ändern daß sie nicht kopiert sondern moved und dann in mein Monatsbackup einbauen.
Schon cool was alles möglich ist face-wink
pbelcl
pbelcl 01.12.2007 um 18:09:38 Uhr
Goto Top
Hallo bastla,

Hab jetzt mal den copy befehl in einen move Befehl ersetzt
Ich bin leider ein verdammter Perfektionist und daher würde ich noch gerne zwei Dinge wissen:

1.) Egal ob ich es mit dem Parameter /Y

rem for %%i in ("%Quelle%") do for /f "tokens=2 delims=." %%m in ('echo %%~ti') do if %%m==%VMN% move /Y "%%i" "%Ordner%\" >>%~n0.log  

oder ohne

for %%i in ("%Quelle%") do for /f "tokens=2 delims=." %%m in ('echo %%~ti') do if %%m==%VMN% move "%%i" "%Ordner%\">>%~n0.log  

mache die Dateien werden immer wortlos überschrieben. Ich will das zwar so haben, doch würde mich interessieren wozu der Parameter da ist wenn er keine Wirkung hat face-wink

2.) habe ich am Ende meines MOVE Befehles eine Umleitung ins LOG File drinnen.
Hatte erwartet daß dort alle kopierten Files stehen. Leider wird da aber nix reingeschrieben.

Passiert das nur wenn ein Fehler auftritt?
Oder habe ich das mit der Umleitung ">>" falsch verstanden?

Wie bekomme ich eine Liste der verschobenen Dateien in mein Log ?
Hast Du einen Tip?

lg
Pauli
bastla
bastla 01.12.2007 um 20:15:24 Uhr
Goto Top
Hallo pbelcl!

ad 1.)
Auch ich hatte den letzten Satz der Online-Hilfe zu "move" lange Zeit überlesen ... face-wink

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  
Durch die Verknüpfung mit "&&" wird der Logeintrag nur erstellt, wenn der "move"-Befehl ohne Fehler beendet wurde.

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).

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
pbelcl
pbelcl 02.12.2007 um 11:41:11 Uhr
Goto Top
ad 1.)
Auch ich hatte den letzten Satz der Online-Hilfe zu "move" lange Zeit
überlesen ... face-wink
Tja, das habe ich wirklich überlesen da es erst vollständig angezeigt wird wenn man einmal ENTER drückt. Meißt habe ich das Fenster vorher schon geschlossen.
Damit ist alles klar, danke!

ad 2.)
Für die Anzeige/das Loggen der verschobenen Dateien musst Du selbst sorgen,

Das habe ich mir eh gedacht, wollte nur sicher gehen.
Werde die von Dir vorgeschlagene Zeile noch einbauen, dann ist das auch OK.
Danke auch hierfür, du bist wirklich Spitze!!