Batch kopieren bis Datum Uhrzeit
Hallo,
ich bin neu hier im Forum und habe ein kleines Problem!
Ich versuche gerade eine Batchdatei zu schreiben, die bei der Erkennung eines Netzwerkes automatisch ein Netzlaufwerk verbindet und dann aus einem Verzeichniss alle Unterverzeichnisse sammt Inhalt kopiert.
Das funktioniert im Prinzip jetzt schon, das eigentliche Problem besteht darin, dass eine Datei aus dem Verzeichniss immer im Schreibprozess ist (ein Datenlogger, der kontinuierlich Daten schreibt und dessen zugehörige Software diese Stundenweise zu Dateien in Unterordner auf dem angeschlossenen PC speichert). Ich würde jetzt also gerne den neuesten Ordner vom Kopiervorgang ausschließen, habe aber keine Ahnung, wie ich das Erstellungsdatum des Ordners heraus bekomme!!! (Wenn der Ordner mit kopiert wird, beendet mir der Kopiervorgang den Schreibprozess der Datenloggersoftware)
Kann mir da evtl. jemand einen Tipp geben? (Geht das überhaupt?)
Als Anhang mal mein Batchfile... (der 1. Ping dient mir nur als delay-Funktion, die IP ist nicht vergeben)
Gruß Christian
ich bin neu hier im Forum und habe ein kleines Problem!
Ich versuche gerade eine Batchdatei zu schreiben, die bei der Erkennung eines Netzwerkes automatisch ein Netzlaufwerk verbindet und dann aus einem Verzeichniss alle Unterverzeichnisse sammt Inhalt kopiert.
Das funktioniert im Prinzip jetzt schon, das eigentliche Problem besteht darin, dass eine Datei aus dem Verzeichniss immer im Schreibprozess ist (ein Datenlogger, der kontinuierlich Daten schreibt und dessen zugehörige Software diese Stundenweise zu Dateien in Unterordner auf dem angeschlossenen PC speichert). Ich würde jetzt also gerne den neuesten Ordner vom Kopiervorgang ausschließen, habe aber keine Ahnung, wie ich das Erstellungsdatum des Ordners heraus bekomme!!! (Wenn der Ordner mit kopiert wird, beendet mir der Kopiervorgang den Schreibprozess der Datenloggersoftware)
Kann mir da evtl. jemand einen Tipp geben? (Geht das überhaupt?)
Als Anhang mal mein Batchfile... (der 1. Ping dient mir nur als delay-Funktion, die IP ist nicht vergeben)
Gruß Christian
@echo off
set /a m=0 & set /a i=0
rem pause
echo %m%
rem pause
echo %i%
rem pause
:anruf
IF %i% LSS 3 (
set /a i=%i%+1
echo anruf
ping -n 1 -w 1000 10.0.8.55
ping -n 1 -w 1000 10.0.8.5
IF %errorlevel%==1 (set /a m=%m%+1
)
echo i=%i%
echo m=%m%
goto anruf
)
IF %m%==0 goto netzlaufwerk
set /a i=0
set /a m=0
goto anruf
:netzlaufwerk
echo bei netzlaufwerk angekommen
echo verbinden
net use "\\10.0.8.20\(f) usb disk" /delete
net use "\\10.0.8.20\(f) usb disk" Passwort /user:xxxxxx
if %errorlevel%==1 goto anruf
xcopy "\\10.0.8.20\(f) usb disk\test" D:\test /c /i /y /f /d /s
if %errorlevel%==0 goto ende
goto anruf
rem echo %errorlevel%
:ende
net use "\\10.0.8.20\(f) usb disk" /delete
pause
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 113907
Url: https://administrator.de/forum/batch-kopieren-bis-datum-uhrzeit-113907.html
Ausgedruckt am: 19.05.2025 um 20:05 Uhr
5 Kommentare
Neuester Kommentar
Hallo die Eule und willkommen im Forum!
Ungetestet würde ich es mit folgenden Zeilen als Ersatz der bisherigen "xcopy"-Zeile versuchen:
Grüße
bastla
Ungetestet würde ich es mit folgenden Zeilen als Ersatz der bisherigen "xcopy"-Zeile versuchen:
for /f "delims=" %%i in ('dir /b /ad /od "\\10.0.8.20\(f) usb disk\test\*.*"') do set "DasNicht=%%i"
echo "%DasNicht%">%temp%\DasNicht.txt
xcopy "\\10.0.8.20\(f) usb disk\test" D:\test /c /i /y /f /d /s /Exclude:%temp%\DasNicht.txt
bastla
Hallo dieEule!
Der angepasste (allerdings ungetestete) Batch könnte dann so aussehen:
Die Änderung der Abfragen
auf
hat mehrere Gründe: Zum Einen werden damit alle Errorlevel >= 1 berücksichtigt, zum Anderen liefert %errorlevel% (wie alle anderen "Nicht-Schleifen-Variablen") innerhalb einer Schleife nur den einmalig am Beginn dieser Schleife zugewiesenen Wert.
Aus diesem Grund erfolgt auch die Überprüfung auf den neuesten Ordner in einem Unterprogramm - dort stehen alle Variablen aktuell zur Verfügung.
Grüße
bastla
P.S.: Ist es Absicht, dass in den Zeilen 11 und 12 unterschiedliche Adressen "gepingt" werden?
P.P.S: Bitte verwende zum Posten von Batches die passende ...
immer die älteste Datei/den ältesten Ordner zu nehmen, zu kopieren und dann zu löschen und den letzten (jüngsten) nicht zu bearbeiten?
.. wäre wohl die beste Vorgangsweise, wenn es sich zeitlich nicht anders ausgeht. Auch für diese Variante ist dann übrigens die obige erste Zeile erforderlich - damit wird nämlich der Name des jüngsten Verzeichnisses ermittelt, indem ein (nach Änderungsdatum) sortiertes Inhaltsverzeichnis erstellt und das letzte Verzeichnis dieser Liste in die Variable %DasNicht% übernommen wird.Der angepasste (allerdings ungetestete) Batch könnte dann so aussehen:
@echo off & setlocal
set /a m=0 & set /a i=0
echo %m%
echo %i%
rem pause
:anruf
if %i% LSS 3 (
set /a i+=1
echo anruf
ping -n 1 -w 1000 10.0.8.55
ping -n 1 -w 1000 10.0.8.5
if errorlevel 1 set /a m+=1
)
echo i=%i%
echo m=%m%
goto anruf
if %m%==0 goto netzlaufwerk
set /a i=0
set /a m=0
goto anruf
:netzlaufwerk
echo bei netzlaufwerk angekommen
echo verbinden
net use "\\10.0.8.20\(f) usb disk" /delete
net use "\\10.0.8.20\(f) usb disk" Passwort /user:xxxxxx
if errorlevel 1 goto anruf
set Error=
for /d %%v in ("\\10.0.8.20\(f) usb disk\test\*.*") do call :ProcessDir "%%v"
if defined Error goto anruf
net use "\\10.0.8.20\(f) usb disk" /delete
pause
goto :eof
:ProcessDir
for /f "delims=" %%i in ('dir /b /ad /od "\\10.0.8.20\(f) usb disk\test\*.*"') do set "DasNicht=%%i"
if /i "%~nx1"=="%DasNicht% goto :eof
xcopy %1 "D:\test\%~nx1\" /c /i /y /f /d /s
if errorlevel 1 set Error=True
goto :eof
if %errorlevel%==1
if errorlevel 1
Aus diesem Grund erfolgt auch die Überprüfung auf den neuesten Ordner in einem Unterprogramm - dort stehen alle Variablen aktuell zur Verfügung.
Grüße
bastla
P.S.: Ist es Absicht, dass in den Zeilen 11 und 12 unterschiedliche Adressen "gepingt" werden?
P.P.S: Bitte verwende zum Posten von Batches die passende ...
Moin dieEule,
Streiche: ping -n 1 -w 1000 10.0.8.55
Setze: ping -n 1 -w 1000 localhost >nul
also den eigenen Rechner anpingen aus o.g. Gründen. Und die Ausgabe ungelesen entsorgen.
Und bei den heutigen Rechnerleistungen würde es nur eine verschmerzbare Verlangsamung des Batches bewirken,
wenn Du so alle paar Zentimeter eine Kommentarzeile einfügst.
So relativ übersichtlich wie der Schnipsel auch jetzt wirken mag - wenn Du ihn in einem Jahr mal wieder wegen irgendeiner Anpassung anfassen musst, dann wirst Du es zu schätzen wissen.
Grüße
Biber
Die erste Adresse dient nur einer Verzögerung um 1 sek.
Dann wäre mein Vorschlag:Streiche: ping -n 1 -w 1000 10.0.8.55
Setze: ping -n 1 -w 1000 localhost >nul
also den eigenen Rechner anpingen aus o.g. Gründen. Und die Ausgabe ungelesen entsorgen.
Und bei den heutigen Rechnerleistungen würde es nur eine verschmerzbare Verlangsamung des Batches bewirken,
wenn Du so alle paar Zentimeter eine Kommentarzeile einfügst.
So relativ übersichtlich wie der Schnipsel auch jetzt wirken mag - wenn Du ihn in einem Jahr mal wieder wegen irgendeiner Anpassung anfassen musst, dann wirst Du es zu schätzen wissen.
Grüße
Biber