dieeule
Goto Top

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

@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

Content-Key: 113907

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

Printed on: April 20, 2024 at 02:04 o'clock

Member: bastla
bastla Apr 15, 2009 at 12:45:18 (UTC)
Goto Top
Hallo die Eule und willkommen im Forum!

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  
Grüße
bastla
Member: dieEule
dieEule Apr 15, 2009 at 13:10:14 (UTC)
Goto Top
Hallo bastla,

danke für die schnelle Antwort!
Ich verstehe die erste Zeile nicht (ich habe gerade erst angefangen mich mit batch (bzw. Programmierung allgemein) zu beschäftigen und spreche/verstehe es deshalb noch nicht so wirklich) kannst du sie mir evtl. erläutern?

Und ich glaube dass es besser wäre, wenn man nur bis zu einem bestimmten Datum/Uhrzeit kopiert, da die Zeit nach der der Datenlogger eine neuen Ordner auf macht während des kopiervorgangs abläuft, und dann würde ja die neu aufgemachte Datei trotzdem kopiert?
Eine funktion kopiere alles ab Datum gibt es ja, gibt es auch kopiere alles bis Datum? (Und dann für Datum Systemdatum minus 2h, oder so)
Oder ist es möglich sich immer die älteste Datei/den ältesten Ordner zu nehmen, zu kopieren und dann zu löschen und den letzten (jüngsten) nicht zu bearbeiten?

Danke schon mal!

Gruß
Christian
Member: bastla
bastla Apr 15, 2009 at 14:49:37 (UTC)
Goto Top
Hallo dieEule!
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
Die Änderung der Abfragen
if %errorlevel%==1
auf
if errorlevel 1
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 ...
Member: dieEule
dieEule Apr 16, 2009 at 17:30:33 (UTC)
Goto Top
Hallo, herzlichen Dank erst mal!

Ich kann gerade nur zwischen Tür und Angel an den Rechner, werde es aber hoffentlich am WE schaffen das auszuprobieren!
Die erste Adresse dient nur einer Verzögerung um 1 sek. Die IP ist garnicht vergeben. (Ich habe nichts gefunden um eine Delay-Funktion zu realisieren)

Das mit der Formatierung werde ich beherzigen!

Danke erst mal

Christian
Member: Biber
Biber Apr 16, 2009 at 21:11:51 (UTC)
Goto Top
Moin dieEule,

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