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

Zeitstempel von Datei überprüfen und verschieben

Frage Entwicklung Batch & Shell

Mitglied: ScoTTy1981

ScoTTy1981 (Level 1) - Jetzt verbinden

16.01.2009, aktualisiert 18.10.2012, 5816 Aufrufe, 10 Kommentare

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
Mitglied: bastla
16.01.2009, aktualisiert 18.10.2012
Hallo ScoTTy1981 und willkommen im Forum!

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

Grüße
bastla
Bitte warten ..
Mitglied: ScoTTy1981
18.01.2009 um 10:37 Uhr
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

01.
:: --snipp GetFileMinutesDemo.bat Parameter1 Filename/File-Wildcards 
02.
:: Placed in the Public Domain for Educational Purposes Biber 2006 
03.
@echo off & setlocal 
04.
call :DateToDays todayInDays %date%    && REM Heutiges Datum  als Ganzzahl 
05.
call :TimeToMins todaysMinutes %time%  && REM Minuten sei Mitternacht als Ganzzahl 
06.
 
07.
For %%i in (%1) do call :CompareMinutes %%i %todayInDays% %TodaysMinutes% 
08.
goto :eof 
09.
 
10.
~~~~~~~~~~ Ende des Hauptbatches... es folgen geCALLte Unterroutinen 
11.
 
12.
:CompareMinutes Parameter1:Datei; Para2: Heute als Ganzzahl; Para3: Minuten heute seit Mitternacht  
13.
 
14.
For /f "tokens=1-2" %%a in ("%~t1") do ( 
15.
   call :DateToDays FileInDays %%a  && REM DateiDatum als Ganzzahl 
16.
   call :TimeToMins FileMinutes %%b && Rem Datei-Minuten seit Mitternacht 
17.
18.
 
19.
Set /a "yesterday=%2-1" 
20.
if %fileinDays% LSS %2                  Set /a "TodayCompMinutes=%3+(60*24)-30"      
21.
If %fileinDays% LSS %2 if 1%todayCompMinutes% GTR 1%fileMinutes% ( 
22.
    (echo [GTR] %~t1 %~f1: von gestern; älter als 30 Minuten)  && goto :eof 
23.
) else ( 
24.
    (echo [LEQ] %~t1 %~f1: von gestern; jünger als 30 Minuten) && goto :eof 
25.
26.
REM verbleibender Fall: Datei ist von Heute: 
27.
Set /a "FileMinutes+=30" 
28.
If %fileminutes% LSS %3 ( 
29.
   echo [GTR] %~t1 %~f1: von heute; älter als 30 Minuten  
30.
	  copy %~f1 c:\test | find ".csv" >> c:\test\transfer.log 
31.
) else ( 
32.
   echo [LSS] %~t1 %~f1: von heute; jünger als 30 Minuten    
33.
)   
34.
goto :eof 
35.
~~~~~~~~~~~ 
36.
:DateToDays ; Para1=Variablenname; Para2 [,Para3] :Datum als "[ttt] TT.MM.[JJ]JJ"  
37.
For %%i in (%2 %3) do set "now=%%i" 
38.
for /f "tokens=1-3 delims=./" %%a in ("%now%") do ( 
39.
      Set /a "%1=((%%c%%100)*365)+((1%%b-100)*12)+(1%%a-100)" ) 
40.
goto :eof 
41.
~~~~~~~~~~ 
42.
:TimeToMins Parameter1: Variablenname Parameter2:Zeit im Format hh:mm 
43.
For /f "tokens=1-2 delims=:" %%a in ("%2") do set /a "%1=(1%%a-100)*60+(1%%b-100)" 
44.
:: ---snapp GetFileMinutesDemo.bat
Bitte warten ..
Mitglied: bastla
18.01.2009 um 11:15 Uhr
Hallo ScoTTy1981!

Eigentlich hatte ich Dich auf die VBS-Variante hinweisen wollen - damit genügt etwa Folgendes:
01.
@echo off & setlocal 
02.
set "Datei=D:\Dein Pfad\Deine Datei.txt" 
03.
 
04.
:::::::::VBScript erzeugen - Beginn 
05.
set G=%temp%\GetFileMinutes.vbs 
06.
>%G% echo WScript.Echo DateDiff("n",CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0)).DateLastModified,Now()) 
07.
:::::::::VBScript erzeugen - Ende 
08.
 
09.
for /f %%m in ('cscript //nologo %G% "%Datei%"') do set Min=%%m 
10.
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
Bitte warten ..
Mitglied: ScoTTy1981
18.01.2009 um 19:41 Uhr
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:

01.
@echo off & setlocal 
02.
set "Datei=c:\*.*" <<== ist keine sprezifische Datei, am besten wäre es wenn er einen ganzen ordner durchsucht 
03.
 
04.
:::::::::VBScript erzeugen - Beginn 
05.
set G=%temp%\GetFileMinutes.vbs 
06.
>%G% echo WScript.Echo DateDiff("n",CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0)).DateLastModified,Now()) 
07.
:::::::::VBScript erzeugen - Ende 
08.
 
09.
for %%i in (%1) do for /f %%m in ('cscript //nologo %G% "%%i"') do if %%m gtr 15 move "%%i" "c:\test\" 
10.
 
11.
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


Grüße

Marco
Bitte warten ..
Mitglied: bastla
18.01.2009 um 20:23 Uhr
Hallo ScoTTy1981!

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

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:
01.
@echo off & setlocal 
02.
set "Quelle=D:\Dein Quellpfad" 
03.
set "Maske=*.csv" 
04.
set /a Alter=15 
05.
set "Ziel=D:\Dein Zielpfad" 
06.
set "Log=D:\transfer.log" 
07.
 
08.
set G=%temp%\GetFileMinutes.vbs 
09.
>%G% echo WScript.Echo DateDiff("n",CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0)).DateLastModified,Now()) 
10.
 
11.
if not exist "%Ziel%" md "%Ziel%" || echo Zielpfad "%Ziel%" konnte nicht erstellt werden! & pause & goto :eof 
12.
 
13.
for %%i in ("%Quelle%\%Maske%") do ( 
14.
    for /f %%m in ('cscript //nologo %G% "%%i"') do if %%m gtr %Alter% ( 
15.
        move "%%i" "%Ziel%\" && >>"%Log%" echo %%i 
16.
17.
)
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:
01.
@echo off & setlocal 
02.
set "Quelle=D:\Dein Quellpfad" 
03.
set "Maske=.csv" 
04.
set /a Alter=15 
05.
set "Ziel=D:\Dein Zielpfad" 
06.
set "Log=%Ziel%\transfer.log" 
07.
 
08.
set G=%temp%\GetFileMinutes.vbs 
09.
>%G% echo WScript.Echo DateDiff("n",CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0)).DateLastModified,Now()) 
10.
 
11.
if not exist "%Ziel%" md "%Ziel%" || echo Zielpfad "%Ziel%" konnte nicht erstellt werden! & pause & goto :eof 
12.
 
13.
for %%i in ("%Quelle%\*.*") do ( 
14.
    for /f %%m in ('cscript //nologo %G% "%%i"') do if %%m gtr %Alter% ( 
15.
        move "%%i" "%Ziel%\" && if /i "%%~xi"=="%Maske%" >>"%Log%" echo %time:~,8% %%~nxi 
16.
17.
)
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 Code formatiert sind ...
Bitte warten ..
Mitglied: ScoTTy1981
18.01.2009 um 20:49 Uhr
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.. (siehe oben)
Bitte warten ..
Mitglied: bastla
18.01.2009 um 21:00 Uhr
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
Bitte warten ..
Mitglied: ScoTTy1981
18.01.2009 um 21:19 Uhr
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...

Grüße Scotty1981
Bitte warten ..
Mitglied: bastla
18.01.2009 um 21:34 Uhr
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 ...

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
Bitte warten ..
Mitglied: ScoTTy1981
18.01.2009 um 21:43 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...