hoerms76
Goto Top

Batch Dateien prüfen und kopieren

Ich habe ein Problem!
Ich will ein Batch schreiben, welches Dateien im Netzwerk mit Dateien auf C: vergleicht, wenn die Dateien identisch sind (speicherdatum komplett gleich)passiert nichts wenn Speicherdatum jünger oder älter ist, oder die Datei in c: nicht existiert wird sie vom Laufwerk auf c: kopiert. Mit xcopy bekomme ich es nicht hin, weil dort nur ältere Dateien aktualisiert werden können!
Wer kann mir ein bischen unter die arme greifen?

Content-Key: 112198

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

Printed on: April 25, 2024 at 03:04 o'clock

Member: Woolfsmann
Woolfsmann Mar 24, 2009 at 07:15:55 (UTC)
Goto Top
Hi,

mit robocopy müste es gehen

befehle müste ungefähr so aussehen

robocopy <quelle> <ziel> /MIR

robocopy kann es sicher bin mir nur nicht sicher ob die optionen stimmen. Kannst du aber in dem Link nachlesen
http://www.wintotal.de/Artikel/robocopy/robocopy.php

gruß
Member: manuel-r
manuel-r Mar 24, 2009 at 08:50:38 (UTC)
Goto Top
Weil "einfach" einfach immer gut ist würde ich - wenn die fraglichen Datein nicht etliche MB/GB groß sind - pauschal immer kopieren. Macht am wenigsten Mühe und funktioniert zuverlässig. Ansonsten halt wie schon angesprochen Robocopy.

Manuel
Member: hoerms76
hoerms76 Mar 24, 2009 at 10:13:04 (UTC)
Goto Top
Ich will halt gerade vermeiden, das immer 200MB aus dem Netzwerk kopiert werden! Deshalb nur die geänderten Dateien. Es kann aber auch sein ein User hat die Datei auf seinem Rechner geändert, deshalb wenn Datei gleich ist nicht kopieren, ansonsten schon! Robocopy ist schlecht , weil wir mit NT arbeiten!

Vielleicht noch ne Lösung?

Gruß Hoerms76
Member: manuel-r
manuel-r Mar 24, 2009 at 10:21:38 (UTC)
Goto Top
Wie wäre es alternativ mit xcopy und der Option /D:d-m-j
Für das Datum setzt du das Datum des letzten Kopiervorgangs. Das sollte funktionieren denke ich.

Manuel
Member: hoerms76
hoerms76 Mar 24, 2009 at 10:40:08 (UTC)
Goto Top
tut mir leid wenn ich nerve, aber er kopiert dann zwar wenn auf dem Laufwerk eine neuere Datei liegt als auf dem rechner, aber es kann sein das ein User irgendwas in der Datei auf dem Rechner ändert, dann muß trotzdem vom Laufwerk kopiert werden, und auf c: überschrieben, also hatte ich gedacht vorab die dateien mit FC vergleichen, und dann bei unterschieden kopieren. Ich komm halt mit dem Batch nicht weiter...

Gruß Hoerms76
Member: manuel-r
manuel-r Mar 24, 2009 at 10:53:34 (UTC)
Goto Top
Dann probier's mal mit
fc /b <quelle>\datei.xyz <ziel>\datei.xyz
if errorlevel 1 copy /y <quelle>\datei.xyz <ziel>\datei.xyz
Member: hoerms76
hoerms76 Mar 24, 2009 at 10:58:57 (UTC)
Goto Top
klingt schon mal gut, und jetzt noch für alle Dateien in einem Ordner ?
Wäre super!!
Gruß Hoerms76
Member: manuel-r
manuel-r Mar 24, 2009, updated at Oct 18, 2012 at 16:37:53 (UTC)
Goto Top
Ich hab für dich mal die Beitrag gefunden, der dir dabei bestimmt hilft.
Member: miniversum
miniversum Mar 24, 2009 at 18:45:24 (UTC)
Goto Top
Mal ne ungetestete Skizze wie es geht:
set "hdd=C:\ordner"  
set "netz=x:\ordner"  
xcopy /d "%netz%\*.*" "%hdd%"  
FOR /F "delims=" %%i in ('xcopy /L /d "%hdd%\*.*" "%netz%"') do copy /y "%netz%\%%~nxi" "%hdd%"  

Oder mit der FC Lösung:
set "hdd=C:\ordner"  
set "netz=x:\ordner"  
xcopy /d "%netz%\*.*" "%hdd%"  
FOR /F "delims=" %%i in ('dir /b "%netz%\*.*"') do fc /b "%netz%\%%i" "%hdd%\%%i" >NUL 2>NUL || copy /y "%netz%\%%i" "%hdd%"  
Member: hoerms76
hoerms76 Mar 26, 2009 at 09:41:22 (UTC)
Goto Top
Super! Mit Xcopy-Befehl klappt alles gut!
Ich möchte jetzt nur noch vorab mein "hdd" bereinigen.
Das heißt alle Dateien die es im Laufwerk nicht mehr gibt, aber auf hdd löschen.
kann ich das vorab noch einbauen?

Gruß Hoerms76
Member: miniversum
miniversum Mar 26, 2009 at 16:41:25 (UTC)
Goto Top
Dann füge vor der 4. Zeile folgende Zeile ein:
FOR /F "delims=" %%i in ('dir /B "%hdd%"') do if not exist "%netz%\%%~nxi" ECHO del "%hdd%\%%~nxi"  
Das ganze ist ungetestet! Daher ist das ECHO drin. Du sieht dann also was er macht. Sieht das gut aus einfach das ECHO weglassen.
Member: hoerms76
hoerms76 Mar 27, 2009 at 15:10:10 (UTC)
Goto Top
Echt klasse!! Batch läuft! Danke!
ich hab ihn folgender maßen zusammengefügt:

set "hdd=c:\123v5w\testordner"
set "netz=c:\123v5w\testlaufwerk"

xcopy "%netz%" /d /y /i /f "%hdd%"
For /f "delims=" %%i in ('dir /b "%hdd%"') do if not exist "%netz%\%%~nxi" del "%hdd%\%%~nxi"
For /f "delims=" %%i in ('xcopy "%hdd%" /y /l /d "%netz%"') do copy /y "%netz%\%%~nxi" "%hdd%"

Er bring nur bei der letzten Zeile eine Fehlermeldung weil er logischerweise beim xcopy die Zeile "1 Datei kopiert" nicht findet, kann ich das noch abstellen, dann wär es wirklich perfekt!
Member: miniversum
miniversum Mar 27, 2009 at 17:03:50 (UTC)
Goto Top
Ändere die Letzte Zeile von
For /f "delims=" %%i in ('xcopy "%hdd%" /y /l /d "%netz%"') do copy /y "%netz%\%%~nxi" "%hdd%"
in
For /f "delims=" %%i in ('xcopy "%hdd%" /y /l /d "%netz%"^|findstr /V /E "Datei(en) kopiert"') do copy /y "%netz%\%%~nxi" "%hdd%"
Dann sollte die Meldung nicht mehr kommen.
Member: hoerms76
hoerms76 Mar 30, 2009 at 08:09:44 (UTC)
Goto Top
ich bin begeistert !!
Danke nochmal!
Gruß Hoerms76
Member: hoerms76
hoerms76 Apr 01, 2009 at 13:00:11 (UTC)
Goto Top
Hi, ich hätte gern noch ne kleine Hilfe:

Bevor mein Batch läuft würde ich gern eine Datei mit einer anderen vergleichen, wenn sie identisch sind macht das Batch nichts, ansonsten siehe oben.

FC /b "%netz%"\protokol.xls "%hdd%"\protokol.xls
IF not errorlevel 1 goto ende

ich hab das so gelöst, das klappt auch, ich möchte nur die FC "Ausgaben" nicht sehen. geht das irgendwie?

Gruß hoerms76
Member: miniversum
miniversum Apr 01, 2009 at 16:06:24 (UTC)
Goto Top
Mit > kannst du die ausgaben umleiten.
NUL leitet Ausgaben ins "Nichts" um.
2>leitet Fehlermeldungen um.
Daraus ergibt nicht das:
FC /b "%netz%"\protokol.xls "%hdd%"\protokol.xls >NUL 2>NUL  
IF not errorlevel 1 goto ende
PS: das ende kanst du dir sparen. Es gibt noch die Spungmarke :eof die imemr ans ende der Datei führt. Die brauchst ud auch nicht extra hinzuschreiben.
FC /b "%netz%"\protokol.xls "%hdd%"\protokol.xls >NUL 2>NUL  
IF not errorlevel 1 goto:eof