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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 106245
Url: https://administrator.de/contentid/106245
Ausgedruckt am: 20.11.2024 um 13:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo ScoTTy1981 und willkommen im Forum!
Als Starthilfe: Bedingung in Abhängigkeit vom Alter einer Datei ...
Grüße
bastla
Als Starthilfe: Bedingung in Abhängigkeit vom Alter einer Datei ...
Grüße
bastla
Hallo ScoTTy1981!
Eigentlich hatte ich Dich auf die VBS-Variante hinweisen wollen - damit genügt etwa Folgendes:
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:
Grüße
bastla
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%
for %%i in (%1) do for /f %%m in ('cscript //nologo %G% "%%i"') do if %%m gtr 15 move "%%i" "D:\Zielordner\"
bastla
Hallo ScoTTy1981!
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:
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:
[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:
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 ...
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:
@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
)
)
if exist "%Log%" del "%Log%"
@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
)
)
[/Edit]
Grüße
bastla
P.S.: Gepostete Batches sind leichter les- und verwendbar, wenn sie als formatiert sind ...
Hallo ScoTTy1981!
aus der Zeile 15 entfernen).
Nochmals zum VBScript: Mit dem Rückgabewert ist folgendes gemeint: Du ruftst im Batch mit
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:
%%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
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% "
Nochmals zum VBScript: Mit dem Rückgabewert ist folgendes gemeint: Du ruftst im Batch mit
cscript //nologo %G% "Datei"
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
So oder so - um das Script brauchst Du Dich eigentlich überhaupt nicht zu kümmern ...
Grüße
bastla
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 ...
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:
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
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
for /f %%m in ('cscript //nologo %temp%\GetFileMinutes.vbs "D:\Dein Quellpfad\test.csv"') do
Zum Rest kannst Du unter "if /?" bzw unter "for /?" (gegen Ende) an der Kommandozeile die Hilfetexte aufrufen ...
Grüße
bastla