deejaybee
Goto Top

Batch - Ordner nach aktuellen Dateien durchsuchen und kopieren

Hallo zusammen,

diesmal habe ich ein kleines Problem mit einem Batchprogramm.


Ich benötige ein Script, welches stündlich (per Taskplaner) einen Ordner C:\Daten\xls nach neuen Dateien durchsucht.
Wenn neue Dateien gefunden wurden, sollen diese neuen Dateien (und nur die) in einen weiteren Ordner C:\Daten\xls_temp kopiert werden.

Wie kann ich das am besten realisieren?


Mein Ansatz war folgender:

set "Datum=%date:~3,2%-%date:~0,2%-%date:~-4%"
set "logfile=log.txt"
xcopy "%Quelle%" "%Ziel%" /D:%Datum% /Y >> %logfile%

Das Script holt mir so aber alle Dateien vom heutigen Tag aus dem Ordner, genauer: ALLE Dateien von heute und überschreibt vorhandene Dateien auch.
Ich müsste es schon etwas genauer haben und brauche pro Durchlauf nur die neu hinzugekommenen Dateien.
Ein weiteres Script räumt dann den temp Ordner wieder auf, nachdem die Dateien darin verarbeitet worden sind.

Von der Theorie her müsste ich mir nur irgendwie merken, wann der letzte Durchlauf war und ab diesem Zeitpunkt wieder neu suchen.


Ich verzwicke mich da aber gerade total kompliziert, deswegen brauch ich mal Eure Hilfe.

Schöne Grüße!

Content-ID: 206286

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

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

bastla
bastla 10.05.2013 um 12:37:51 Uhr
Goto Top
Hallo DeeJayBee!

Dafür müsste doch eigentlich, ganz ohne die Timestamps beachten zu müssen, "xcopy /m" genügen ...

Grüße
bastla
Penny.Cilin
Penny.Cilin 10.05.2013 aktualisiert um 13:14:17 Uhr
Goto Top
Hallo DeeJayBee,

warum nimmst Du dafür nicht Robocopy? Mit den Robocopy Parametern /MON:<änderungen> bzw. /MOT:<minuten> kann man dies sehr gut realisieren.
Die Parameter <änderungen> bzw. <minuten> müssen dann sinngemäß angepasst werden.


Gruss Penny.
Endoro
Endoro 10.05.2013 um 13:16:50 Uhr
Goto Top
Hallo DeeJayBee,

es geht einfach so:
>>"%logfile%" xcopy "%Quelle%" "%Ziel%" /D /Y   

Gruss!
bastla
bastla 10.05.2013 aktualisiert um 13:28:15 Uhr
Goto Top
@ Endoro

Ist so aber eine Frage des Timings (da vom Zielordner abhängig, der ja zwischendurch "aufgeräumt" - also vermutlich geleert - wird) ...

Grüße
bastla
Endoro
Endoro 10.05.2013 aktualisiert um 15:49:16 Uhr
Goto Top
Nehmen wir doch einfach das Script aus dem Nachbarthread:
@echo off &setlocal
set "fname="  
set "ftd="  
call:GetInternational
for /f "tokens=1-3*" %%a in ('dir /a-d /tw ^| findstr /b [0-9]') do set "ftd=%%a %%b"&set "fname=%%d"&call:process  
goto:eof

:process
rem Get file time:
set "fdate=%ftd:~0,10%"  
set "ftime=%ftd:~11%%sTime%00%sDecimal%00"  

call :GetSecs "%fdate%" "%ftime%" fileSecs  
call :GetSecs "%date%" "%time%" curSecs  
set /a elapsed="(curSecs-fileSecs)/60"  
if %elapsed% lss 60 if not exist "C:\Daten\xls_temp\%fname%" copy "%fname%" C:\Daten\xls_temp  
goto :eof

:GetInternational
:: Sets a bundle of variables by reading the registry settings
for /f "tokens=1,2*" %%a in ('reg query "HKCU\Control Panel\International"') do set "%%a=%%c"  
goto :eof

:GetSecs "dateIn" "timeIn" secondsOut 
::  Output:  Seconds elapsed since 1th Jan. 1970 00:00:00
setlocal
set "dateIn=%~1"  
for /f "tokens=2" %%i in ("%dateIn%") do set "dateIn=%%i"  
for /f "tokens=1-3 delims=%sDate%" %%a in ("%dateIn%") do (  
  if %iDate%==0 set /a mm=100%%a%%100,dd=100%%b%%100,yy=10000%%c%%10000
  if %iDate%==1 set /a dd=100%%a%%100,mm=100%%b%%100,yy=10000%%c%%10000
  if %iDate%==2 set /a yy=10000%%a%%10000,mm=100%%b%%100,dd=100%%c%%100
)
for /f "tokens=1-3 delims=%sTime%%sDecimal% " %%a in ("%~2") do (  
  set "hh=%%a"  
  set "nn=%%b"  
  set "ss=%%c"  
)
if 1%hh% lss 20 set hh=0%hh%
if /i "%nn:~2,1%" equ "p" if "%hh%" neq "12" (set "hh=1%hh%" &set /a hh-=88)  
if /i "%nn:~2,1%" equ "a" if "%hh%" equ "12" set "hh=00"  
if /i "%nn:~2,1%" geq "a" set "nn=%nn:~0,2%"  
set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2,j=j/5+dd+y*365+y/4-y/100+y/400-2472633,j=j*86400+hh*3600+nn*60+ss
endlocal &set "%~3=%j%"  
goto :eof

endlocal
.. und das dann stündlich per Taskplaner starten.

Gruss!
DeeJayBee
DeeJayBee 10.05.2013 um 15:21:32 Uhr
Goto Top
Danke für Eure schnellen Antworten.

Endoro: Deine erste Lösung funktioniert nicht, da die Dateien, die vorher drin waren zwischenzeitlich weg sind. In dem Ordner sollen also nur Dateien sein, die es vorher im Quellordner noch nicht gab.

Die Idee mit dem Robocopy schau ich mir gerne mal an.

xcopy mit /m hat vorhin irgendwie nicht 100%ig funktioniert. Es waren plötzlich wieder Dateien da, die ich vorher gelöscht hatte. Aber das prüfe ich noch mal.

Zu der letzten Lösung von Endoro: Das sieht ja ein wenig kompliziert aus, das Ding macht ja weit mehr als das, was ich brauche. Und an die Registry muss ich wegen so etwas schon gar nicht dran.

Der Hintergrund ist ja nur, dass es sich um Dateien handelt, die aus dem Tempordner als PDF gedruckt werden und dann verschickt werden. Da wäre es halt blöd, wenn die Dateien dann jeweils doppelt entstehen. Daher brauche ich nur die geänderten Dateien.
Bisher hatte ich es halt so, dass der Vorgang einmal am Tag stattfindet, damit hätte ich dann kein Problem. Aber nun ist der Wunsch dies mehrmals täglich zu tun.

Ich bastel mal etwas weiter rum und teile Euch mein Ergebnis mit.

Schöne Grüße
Endoro
Endoro 10.05.2013 um 15:25:43 Uhr
Goto Top
Hallo, das Script verstellt nichts in der Registry, es werden nur die Einstellungen für Datum- und Zeitformat ausgelesen.

Gruss!
bastla
bastla 10.05.2013 um 15:45:24 Uhr
Goto Top
Hallo DeeJayBee!

Zu "xcopy /m": Es wird hier das "Archiv"-Attribut genutzt - wenn eine Datei gespeichert (= verändert oder neu erstellt) wird, setzt das System automatisch das "Archiv"-Attribut (ansehen kannst du Dir das mit "attrib").

Mit "xcopy /m" werden nur Dateien kopiert, bei denen dieses Attribut gesetzt ist und es wird auch zurückgesetzt - wenn sich daher die Datei seit dem letzten Lauf des Batches nicht verändert hat, dürfte sie auch nicht kopiert werden.

Grüße
bastla
Penny.Cilin
Penny.Cilin 13.05.2013 aktualisiert um 08:13:23 Uhr
Goto Top
Zitat von @DeeJayBee:

Die Idee mit dem Robocopy schau ich mir gerne mal an.

Damit Du Dich nicht mit den Parametern von Robocopy verhedderst, empfehle ich Dir dazu YARCGUI Robocopy GUI. Da bekommst du eine Erläuterung der Parameter.


Gruss Penny.
DeeJayBee
DeeJayBee 28.05.2013 um 10:08:22 Uhr
Goto Top
Hallo noch einmal,

ist ein paar Tage her, aber ich wollte Euch mein Ergebnis mitteilen.

Vom Prinzip her hat ein einfaches
xcopy %Quelle" %Ziel% /m
gereicht.

Anscheinend ist in meinen vorhergehenden Tests irgendwas schief gelaufen. Es funktioniert nun einwandfrei.

Danke Euch allen!