scotty1981
Goto Top

Zeitstempel von Datei überprüfen und verschieben

Gude an alle,

ich hab hier ein prob welches ich nicht ohne hilfe gelöst bekomme, ich möchte eine batch schreiben, welche mehrere Dateien überprüft.
Dies soll wiefolgt ablaufen: Ist eine Datei älter als 15 Minuten soll diese in einen ordner verschoben werden.

Dort soll dann ein txt file generiert werden, indem nur eine bestimmte art dateiformat in die txt geloggt wird (*.csv).

Ich dachte sowas an wie xcopy, dort habe ich aber nur das die möglichkeit mit einen festen datum zu arbeiten... oder doch nicht??

kann mir bitte einer helfen.... zumindest wie die syntax des xcopy befehles ist oder gibt es da noch eine andere möglichkeit??

grüße marco

Content-ID: 106245

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

Ausgedruckt am: 20.11.2024 um 13:11 Uhr

bastla
bastla 16.01.2009, aktualisiert am 18.10.2012 um 18:37:37 Uhr
Goto Top
Hallo ScoTTy1981 und willkommen im Forum!

Als Starthilfe: Bedingung in Abhängigkeit vom Alter einer Datei ...

Grüße
bastla
ScoTTy1981
ScoTTy1981 18.01.2009 um 10:37:22 Uhr
Goto Top
Hallo biber,

danke danke für die Begrüßung und den post, so was suche ich,habe auch die copy passage hinzugefügt indem die zeit kontrolliert wird.
Wenn ich aber jetzt nur den zeitstempel kontrollieren will (ohne datum), wie muss ich denn den folgenden Quellcode ändern, kannste mir büdde helfen??

Grüße Marco

:: --snipp GetFileMinutesDemo.bat Parameter1 Filename/File-Wildcards
:: Placed in the Public Domain for Educational Purposes Biber 2006
@echo off & setlocal
call :DateToDays todayInDays %date%    && REM Heutiges Datum  als Ganzzahl
call :TimeToMins todaysMinutes %time%  && REM Minuten sei Mitternacht als Ganzzahl

For %%i in (%1) do call :CompareMinutes %%i %todayInDays% %TodaysMinutes%
goto :eof

~~~~~~~~~~ Ende des Hauptbatches... es folgen geCALLte Unterroutinen

:CompareMinutes Parameter1:Datei; Para2: Heute als Ganzzahl; Para3: Minuten heute seit Mitternacht 

For /f "tokens=1-2" %%a in ("%~t1") do (  
   call :DateToDays FileInDays %%a  && REM DateiDatum als Ganzzahl
   call :TimeToMins FileMinutes %%b && Rem Datei-Minuten seit Mitternacht
)

Set /a "yesterday=%2-1"  
if %fileinDays% LSS %2                  Set /a "TodayCompMinutes=%3+(60*24)-30"       
If %fileinDays% LSS %2 if 1%todayCompMinutes% GTR 1%fileMinutes% (
    (echo [GTR] %~t1 %~f1: von gestern; älter als 30 Minuten)  && goto :eof
) else (
    (echo [LEQ] %~t1 %~f1: von gestern; jünger als 30 Minuten) && goto :eof
)
REM verbleibender Fall: Datei ist von Heute:
Set /a "FileMinutes+=30"  
If %fileminutes% LSS %3 (
   echo [GTR] %~t1 %~f1: von heute; älter als 30 Minuten 
	  copy %~f1 c:\test | find ".csv" >> c:\test\transfer.log  
) else (
   echo [LSS] %~t1 %~f1: von heute; jünger als 30 Minuten   
)  
goto :eof
~~~~~~~~~~~
:DateToDays ; Para1=Variablenname; Para2 [,Para3] :Datum als "[ttt] TT.MM.[JJ]JJ"  
For %%i in (%2 %3) do set "now=%%i"  
for /f "tokens=1-3 delims=./" %%a in ("%now%") do (  
      Set /a "%1=((%%c%%100)*365)+((1%%b-100)*12)+(1%%a-100)" )  
goto :eof
~~~~~~~~~~
:TimeToMins Parameter1: Variablenname Parameter2:Zeit im Format hh:mm
For /f "tokens=1-2 delims=:" %%a in ("%2") do set /a "%1=(1%%a-100)*60+(1%%b-100)"  
:: ---snapp GetFileMinutesDemo.bat
bastla
bastla 18.01.2009 um 11:15:21 Uhr
Goto Top
Hallo ScoTTy1981!

Eigentlich hatte ich Dich auf die VBS-Variante hinweisen wollen - damit genügt etwa Folgendes:
@echo off & setlocal
set "Datei=D:\Dein Pfad\Deine Datei.txt"  

:::::::::VBScript erzeugen - Beginn
set G=%temp%\GetFileMinutes.vbs
>%G% echo WScript.Echo DateDiff("n",CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0)).DateLastModified,Now())  
:::::::::VBScript erzeugen - Ende

for /f %%m in ('cscript //nologo %G% "%Datei%"') do set Min=%%m  
echo %Min%
Diese Demo soll für die angegebene Datei das Alter in Minuten liefern - natürlich kannst Du das Ganze auch in einer Schleife für mehrere Dateien verwenden. Nachdem das VBScript am Anfang des Batches erzeugt wurde, etwa so:
for %%i in (%1) do for /f %%m in ('cscript //nologo %G% "%%i"') do if %%m gtr 15 move "%%i" "D:\Zielordner\"
Grüße
bastla
ScoTTy1981
ScoTTy1981 18.01.2009 um 19:41:40 Uhr
Goto Top
Gude bastla,

sorry das ich den falschen benutzer niedergeschrieben habe.
Leide habe ich von vbs null peilung.

Aber so wie ich das verstehe paste ich folgendes in die vbs:

@echo off & setlocal
set "Datei=c:\*.*" <<== ist keine sprezifische Datei, am besten wäre es wenn er einen ganzen ordner durchsucht  

:::::::::VBScript erzeugen - Beginn
set G=%temp%\GetFileMinutes.vbs
>%G% echo WScript.Echo DateDiff("n",CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0)).DateLastModified,Now())  
:::::::::VBScript erzeugen - Ende

for %%i in (%1) do for /f %%m in ('cscript //nologo %G% "%%i"') do if %%m gtr 15 move "%%i" "c:\test\"  

echo %Min%


Ist es möglich das die vbs ein transfer.log schreibt in der nur *.csv aufgelistet sind??

Ich kann mich nicht genug bedanken für dein hilfe face-smile


Grüße

Marco
bastla
bastla 18.01.2009 um 20:23:15 Uhr
Goto Top
Hallo ScoTTy1981!

sorry das ich den falschen benutzer niedergeschrieben habe.
Dafür musst Du Dich bei Biber entschuldigen ... face-wink

Leide habe ich von vbs null peilung.
Das Script wird ja ohnehin durch den Batch erstellt, und für die Verwendung hast Du 2 Beispiele - alles, was Du tun musst, ist, den Rückgabewert in Batch zu übernehmen und auszuwerten ...
Wenn es nur darum geht, alle ".csv"-Dateien eines Ordners mit einem Alter von mehr als 15 Minuten zu verschieben (und nicht darauf geachtet werden muss, ob sich im Zielordner schon eine gleichnamige Datei befindet), sähe das etwa so aus:
@echo off & setlocal
set "Quelle=D:\Dein Quellpfad"  
set "Maske=*.csv"  
set /a Alter=15
set "Ziel=D:\Dein Zielpfad"  
set "Log=D:\transfer.log"  

set G=%temp%\GetFileMinutes.vbs
>%G% echo WScript.Echo DateDiff("n",CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0)).DateLastModified,Now())  

if not exist "%Ziel%" md "%Ziel%" || echo Zielpfad "%Ziel%" konnte nicht erstellt werden! & pause & goto :eof  

for %%i in ("%Quelle%\%Maske%") do (  
    for /f %%m in ('cscript //nologo %G% "%%i"') do if %%m gtr %Alter% (  
        move "%%i" "%Ziel%\" && >>"%Log%" echo %%i  
    )
)
Falls das Log bei jedem Start des Batches gelöscht werden soll, noch die folgende Zeile vor der "for"-Schleife in Zeile 13 einfügen:
if exist "%Log%" del "%Log%"
[Edit] Nach nochmaligem Lesen der Problemstellung interpretiere ich das jetzt (hoffentlich richtig) so, dass zwar alle Dateien verschoben, aber nur ".csv"-Dateien geloggt werden sollen - dann:
@echo off & setlocal
set "Quelle=D:\Dein Quellpfad"  
set "Maske=.csv"  
set /a Alter=15
set "Ziel=D:\Dein Zielpfad"  
set "Log=%Ziel%\transfer.log"  

set G=%temp%\GetFileMinutes.vbs
>%G% echo WScript.Echo DateDiff("n",CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0)).DateLastModified,Now())  

if not exist "%Ziel%" md "%Ziel%" || echo Zielpfad "%Ziel%" konnte nicht erstellt werden! & pause & goto :eof  

for %%i in ("%Quelle%\*.*") do (  
    for /f %%m in ('cscript //nologo %G% "%%i"') do if %%m gtr %Alter% (  
        move "%%i" "%Ziel%\" && if /i "%%~xi"=="%Maske%" >>"%Log%" echo %time:~,8% %%~nxi  
    )
)
Dafür gibt's jetzt zusätzlich im Log die Angabe der Zeit (wobei diese allerdings für alle im jeweiligen Batchlauf verschobenen Dateien gleich angezeigt wird).
[/Edit]

Grüße
bastla

P.S.: Gepostete Batches sind leichter les- und verwendbar, wenn sie als formatiert sind ...
ScoTTy1981
ScoTTy1981 18.01.2009 um 20:49:45 Uhr
Goto Top
huhu bastla,

das verstehe ich jetzt nicht so ganz, meine das sich das script sich nicht von selbst ausführt ist mir ja klar, aber wie soll denn dann die *.bat aussehen (mit Rückgabewerten??) ??

Sorry für die evenutell DAU fragen *g*

Grüße ScoTTy1981

p.s.: kerl ist ja der hammer ( :D ), jo das kommt so hin, exat so muss der ablauf sein, aber das ausführen macht mir noch probs.. face-smile (siehe oben)
bastla
bastla 18.01.2009 um 21:00:25 Uhr
Goto Top
Hallo ScoTTy1981!

im hauptordner sollen alle *.csv und *.pdf's die älter als 15 MInuten sind, in einen anderen ordner verschoben werden. Aber in der transfer.log sollen nur die *.csv drin stehen, da diese von einem Programm ausgelesen werden soll.
Die inzwischen zusätzlich gepostetet Version sollte das bereits so machen (wobei dann die Zeitangabe vermutlich stört - daher ggf den Teil
 "%time:~,8% "
aus der Zeile 15 entfernen).
Nochmals zum VBScript: Mit dem Rückgabewert ist folgendes gemeint: Du ruftst im Batch mit
cscript //nologo %G% "Datei"
das Script auf (wobei "Datei" in diesem Fall eben als Variable "%%i" übergeben wird). Das Script ermittelt das Alter in Minuten und gibt den entsprechenden Wert aus.

Vom Batch übernommen wird diese Minutenanzahl, indem der Script-Aufruf in eine "for"-Schleife verpackt wird:
for /f %%m in ('cscript //nologo %G% "Datei"') do echo %%m
%%m enthält das Alter in Minuten und wird in diesem Beispiel einfach ausgegeben - oben habe ich gezeigt, wie das Alter in eine Variable geschrieben werden kann, und im Batch wird %%m gleich direkt zum Vergleichen mit 15 (Minuten) verwendet.

So oder so - um das Script brauchst Du Dich eigentlich überhaupt nicht zu kümmern ...

Grüße
bastla
ScoTTy1981
ScoTTy1981 18.01.2009 um 21:19:54 Uhr
Goto Top
hi bastla,

ok das verstehe, das der wert (Zeit) an das vbs script übergeben werden soll. Dort wird es dann berechnet und übt dann die nachfolgenden aktionen aus.

aber mir ist immer noch nicht klar, wie ich die batch schreiben soll, mit den zwei zeilen die du veröffentlichst hast, kann es unmöglich laufen.

Wo gebe ich denn die Scriptdatei "dateproof.vbs" in der batch an und es muss doch eine art zuweisung für die variable "Datei" geben oder sehe ich das falsch

Fragen über fragen, hoffe du hast noch lust zu antworten... face-smile

Grüße Scotty1981
bastla
bastla 18.01.2009 um 21:34:14 Uhr
Goto Top
Hallo ScoTTy1981!

Vielleicht zur Sicherheit vorweg: Es geht hier um einen Batch - es gibt für Dich nichts als ".vbs" zu speichern oder zu bearbeiten ...

ok das verstehe, das der wert (Zeit) an das vbs script übergeben werden soll. Dort wird es dann berechnet und übt dann die nachfolgenden aktionen aus.
Keineswegs - an das Script wird der Dateipfad übergeben, das Script ermittelt das Alter, und den Rest erledigt der Batch.

aber mir ist immer noch nicht klar, wie ich die batch schreiben soll, mit den zwei zeilen die du veröffentlichst hast, kann es unmöglich laufen.
Vielleicht testest Du einmal die 17-Zeilen-Version ... face-wink

Wo gebe ich denn die Scriptdatei "dateproof.vbs" in der batch an
Das Script wird dynamisch vom Batch selbst im Ordner %temp% erstellt - da es nicht automatisch gelöscht wird, findest Du es dort auch nach dem Ende des Batches unter dem Namen "GetFileMinutes.vbs". Eben dieser Name (bzw der gesamte Pfad zum Script) befindet sich nach der Erstellung in der Variablen %G%, und so wird das Script auch aufgerufen (also nicht als "dateproof.vbs").

es muss doch eine art zuweisung für die variable "Datei" geben oder sehe ich das falsch
Da Du alle Dateien des Quellordners berücksichtigen willst, muss eine Schleife verwendet werden:
for %%i in ("%Quelle%\*.*") do
Damit wird jede Datei (*.*) durch die Schleife erfasst und steht als %%i zur Verfügung. Wenn die erste Datei "test.csv" hieße, würde innerhalb der Schleife dann das Script so aufgerufen:
for /f %%m in ('cscript //nologo %temp%\GetFileMinutes.vbs "D:\Dein Quellpfad\test.csv"') do
Ergebnis dieses Aufrufes wäre dann etwa die Zahl 200, wenn die "test.csv" bereits 200 Minuten alt sein sollte. Dieses Ergebnis steht dann als %%m zur Verfügung.

Zum Rest kannst Du unter "if /?" bzw unter "for /?" (gegen Ende) an der Kommandozeile die Hilfetexte aufrufen ...

Grüße
bastla
ScoTTy1981
ScoTTy1981 18.01.2009 um 21:43:32 Uhr
Goto Top
ohhhh man ich bin sooooo blöd, klar jetzt weiss ich was du meinst.... *g*
klappt einwandfrei, der hammer, *freu*

nochmals vielen dank bastler für dein verständnis und die geduld :D

Big thx to bastler

Grüße Marco