theuncle
Goto Top

Mit Xcopy NUR nicht vorhandene Dateien kopieren

Mit Boardmitteln sprich XCOPY in einer Batch nur "NICHT VORHANDENE" Dateien in ein Verzeichnis kopieren!

Hallo Leute,

ich als alter Batchfanatiker und "Verfechter immer zur Verfügung stehender Befehle" (also OHNE ROBOCOPY) benötige eine Batch welche NUR nicht vorhandene Dateien in ein Verzeichnis kopiert.

Beispielereignis:

Verzeichnis Daten auf einem Server gelöscht und mit Recoverytool nur unvollständig in ein Testverzeichnis wieder hergestellt. Datensicherung ist etwas älter und wird ersteinmal wieder an die ursprüngliche Position kopiert. Nun sollen nur nicht vorhandene Dateien aus dem wiederhergestellten Verzeichnis in das neue "alte" Datenverzeichnis kopiert werden.

On Top wäre eine optionale Funktion für das Ausklammern von Null-grossen Dateien - die defekten bzw. nur schlecht restaurierten Dateien halt.

So könnte man sicherstellen nur voll funktionsfähige alte Dateien im Datenordner zu haben und nur die rel. intakten NEUEN (nicht vorhandenen) Dateien kopiert zu haben. Deswegen nützt mir der Schalter -D nicht so viel.

Vielen Dank im voraus für Eure Hilfe. Biber, ich erwarte, wie immer, godlike-Leistungen face-smile

CU der Onkel Olli face-wink

Content-Key: 19933

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

Printed on: April 19, 2024 at 14:04 o'clock

Member: SexyHexe
SexyHexe Nov 18, 2005 at 01:19:06 (UTC)
Goto Top
Hallo,

also so wie ich das sehe, bietet XCOPY keine Option so etwas zu machen.

Grüsse,
SexyHexe
Member: theuncle
theuncle Nov 18, 2005 at 07:25:10 (UTC)
Goto Top
Halli hallo,

deswegen habe ich die Anfrage ja auch in den Bereich Batchprogrammierung gesetzt, da ich weiss, dass es mit xcopy so nicht geht, allerdings mit einer Batch evtl. zu realisieren ist ...

CU Olli
Member: Biber
Biber Nov 18, 2005 at 08:35:54 (UTC)
Goto Top
Moin Tee-Onkel,

ich würde das "Problem" eigentlich trennen.
Diese 0-Byte-Dateien würde ich einmalig löschen. Wenn ich dich richtig verstanden habe, kannst Du mit denen ja eh nie wieder etwas anfangen.

Alle 0-Byte-Dateien vom CMD-Prompt aus ansehen oder löschen geht ja fix:
(anschauen) FOR /R startverzeichnis %f in (*.*) do @if %~zf equ 0 @echo %~ftzf
(löschen) FOR /R startverzeichnis %f in (*.*) do @if %~zf equ 0 @del %~ff

Zwischen "anschauen" und "löschen" kann natürlich noch eine Entscheidungsphase liegen. Denn nicht alle 0-Byte-Dateien sind "unsinnig"- manche sind ja nur als "Flag-Dateien" gedacht und sollen gar keinen Inhalt haben.
Deshalb ist hier kein Batch sinnvoll, sondern eben die zwei CMD-Zeilen.

Anyway, back to thread - Du wolltest ja alles in einer Batch haben. Ich nenne die Quell- und Zielverzeichnisse mal q:\quell und z:\ziel.
Hint: ich gebe dem XCopy hier auch Parameter ( /h /r ) mit für "versteckte/Schreibgeschütze" etc. Ggf. ändern.

::------ snipp T-OnkelsRestore.bat
@echo off & setlocal & set "XCopyParms=/y /h /r /i /e"  
xcopy q:\quell z:\ziel /u /l %XCopyParms% >"%temp%\Exclude.txt"  
FOR /R q:\quell %%f in (*.*) do if %%~zf equ 0 ECHO %%~ff >>"%temp%\Exclude.txt"  
REM gestrichen ---xcopy q:\quell z:\ziel %XcopyParms% /exclude:"%temp%\Exclude.txt"   
REM gestrichen --- siehe Beiträge/Bugmeldung unten
xcopy q:\quell z:\ziel %XcopyParms% /exclude:%temp%\Exclude.txt
::------ snapp T-OnkelsRestore.bat
Mimik:
(0.te Zeile ist die "@echo off..." die zähl ich nicht mit)
In der 1. Zeile werden alle Dateien, die auch schon im Zielverzeichnis existieren, in eine Datei geschrieben.
In der 2. Zeile werden alle 0-Byte-Dateien an diese Datei angehängt.
in der 3. Zeile wird tatsächlich etwas getan.

Thats all.

HTH
Biber
Member: cookie
cookie Nov 18, 2005 at 08:50:17 (UTC)
Goto Top
Hallo Olli.

Das geht ganz einfach, indem du am schluss die Option /mir mitgibst. alle dateien welche erneuert oder hinzugefügt wurden werden kopiert, die anderen nicht.

Gruss
Cookie
Member: theuncle
theuncle Dec 01, 2005 at 20:09:28 (UTC)
Goto Top
Hallo Bibber face-smile,

so ich schreibe diesen Text jetzt zum zweiten Mal, da ich mal wieder vergessen habe
vorher mir eine Kopie in meine Zwischenablage zu legen.

Gott im Himmel dieser Mist, wenn man mal 3 Min den Browser alleine lässt und sich dann neu einloggen kann und der gesamte Text weg iss ... das sollte hier auch mal verbessert werden. Aber das nur nebenbei. Diesmal mach ichs kürzer ....

Ich melde mich leider erst jetzt zurück, da ich nach einem kurzen Ausprobieren der Batch
leider keine Zeit mehr gefunden hatte mich damit intensiver zu beschäftigen.

Ich weiss nicht, ob das ein win2k winxp-Problem iss und evtl. sich mal wieder nur ein
paar Konsolenausgaben oder Befehle geringfügig verändert haben. Langer Rede kurzer Sinn, ich habs nur auf nem Win2K-System getestet. (Wie z.B. bei der date-Ausgabe
... hat mich bei automatisch generierten Datumsverzeichnissen bei Datensicherungen schon eine Menge Nerven gekostet.)

Fehlermeldung auf die For-Schleife bezogen:

"~zf" ist syntaktisch an dieser Stelle falsch.

Der Exlude.txt wird korrekt erstellt und enthält die beiden ebenfalls in dem anderen Verzeichnis vorkommenden Dateien (zum Test) mit Pfadangabe.

Vielleicht weisst Du ja woran es liegt.

Vielen Dank im voraus

MfG der Onkel Olli face-smile=
Member: Biber
Biber Dec 01, 2005 at 20:32:49 (UTC)
Goto Top
Moin, Olli,
schön Dich zu lesen... hab schon befürchtet, Du hättest doch lieber eine Umschulung zum Pizzabäcker begonnen, weil Dir das zu viele Bätch-Zeilen waren.. face-wink

Okay, ist mit furchtbar peinlich, aber oben in der zweiten echten Zeile habe ich wieder ein paar %-Zeichen vergessen (ich habs naturlich wieder nur am Prompt "getestet" und danach aus eigentlich allen "%" -Zeichen ein "%%" gemacht... dachte ich)...

Falsch:
FOR /R q:\quell %f in (*.*) do if %~zf equ 0 ECHO %%~ff >>"%temp%\Exclude.txt"
Richtiger im Batch:
FOR /R q:\quell %%f in (*.*) do if %%~zf equ 0 ECHO %%~ff >>"%temp%\Exclude.txt"

Ich verbessere es oben!!
Kann sein, dass noch irgendwelche 0-Byte-Dateien mit Leerzeichen durchs Raster fallen, weil die in Anführungszeichen gesetzt werden müssen (also "%%~ff") .. den Fall hab ich vernachlässigt. Kommt eher selten vor..

Nun sollte es durchlaufen (wie gesagt, habs oben berichtigt!).
Grüße Biber
Member: theuncle
theuncle Dec 09, 2005 at 18:26:31 (UTC)
Goto Top
Hay Bibber,

habe die Zeilen angepasst, nur leider schmeisst er die Fehlermeldung aus:

Datei c:\test5\Exclude.txt kann nicht gelesen werden.
0 Dateien kopiert.

(Habe mir die Freiheit genommen den %temp% rauszunehmen, da dort die gleiche Fehlermeldung kam und ich sicherstellen wollte, dass die Batch darauf zugreifen kann.)

In der Exclude-Datei stehen die richtigen in dem Verzeichnis vorhandenen Dateien drin. Where is the problem. Was könnte ich übersehen haben ...

Vielleicht haste noch eine Idee ... thanx ..

Der Onkel face-smile
Member: Biber
Biber Dec 09, 2005 at 20:36:10 (UTC)
Goto Top
Sorry, Olli,
mea culpa, mea culpa... face-sad
Hat mir neulich schon der User hammel geschrieben: Wer lesen kann, ist klar im Vorteil. Hätte ich drauf hören sollen...
Ich war zu vorsichtig wegen eventueller Leerzeichen im %temp%-Path und habe deshalb die Datei nach dem "/exclude"-Parameter in Anführungszeichen gesetzt. Das nimmt Xcopy übel, wenn Pfad und Dateiname keine Leerzeichen enthalten.

also bitte nochmal ändern:

REM Bullshit xcopy q:\quell z:\ziel %XcopyParms% /exclude:"%temp%\Exclude.txt"
xcopy q:\quell z:\ziel %XcopyParms% /exclude:%temp%\Exclude.txt
[Edit] Bugfix oben im Batch nachgezogen [/Edit]
bzw.
xcopy q:\quell z:\ziel %XcopyParms% /exclude:c:\test5\Exclude.txt

Ich versuche mich zu bessern... demnächst fange ich an, meine Schnipsel zu testen... face-wink

P.S. Dass man/frau bei diesem Parameter überhaupt eine Datei mit einer Liste von Dateien übergeben kann, ist im höchsten Maße undokumentiert.
Aus der "XCopy /?"-Hilfe:
....
/EXCLUDE:Datei1[+Datei2][+Datei3]...
          Gibt eine Liste von Zeichenfolgen an. Wenn eine der
          Zeichenfolgen Teil des absoluten Verzeichnispfads
          der zu kopierenden Datei ist, wird diese Datei vom
          Kopiervorgang ausgeschlossen. Beispiel: Bei der
          Zeichenfolge \obj\ oder .obj werden alle Dateien
          unterhalb des Verzeichnisses OBJ bzw. alle Dateien mit
          der Erweiterung .obj vom Kopiervorgang ausgeschlossen.
          
.....
Also berufe Dich nicht auf mich und erzähl es um Himmels Willen nicht weiter.

Schönes Wochenende
Biber
Member: theuncle
theuncle Dec 10, 2005 at 14:38:26 (UTC)
Goto Top
Jawolle,

da hätte ich eigentlich drauf kommen sollen. Aber wie immer, sieht man die Batch vor
lauter Anführungszeichen nicht.

Sehr schön, ich habe zwar damals das nicht mit dieser Batch lösen können und musste zu Fuss
(und wir wissen, wie sehr das einem Informatiker missfällt ggg*) mit dem Kunden zusammen
diese Daten rauspopeln. Es hat sich damals im Übrigen nur ein Verlust von 13 Dateien ergeben, von denen sogar nur 3 relevant waren. Zum Glück war der Grossteil in der SQL-Datenbank...

und wenn da der Onkel nicht mittlerweile einen Enterprise-Wartungsplan eingerichtet hätte mit automatischer Sicherung, hätten wir uns erschiessen können ... face-smile

Diese Batch wird Ihre Anwendung in Zukunft auf unseren Install-Support-CDs oder USB-Sticks
mit Sicherheit finden.

Nochmals, however, VERY THANX ... gg* wie immer sehr hübsch...

Schönes WE ...

Der Onkel face-smile

P.S.: Nette Grüsse von unserer Tips-Datenbank, diese Batch wollte Sie haben.
Member: Biber
Biber Dec 10, 2005 at 14:57:31 (UTC)
Goto Top
Na Gottseidank, Tee-Onkel,

endlich haben wir die Kuh vom Eis... *drei-Kreuze-mach** face-wink

Gruß zurück an die Tipp-Datenbank - wenn die wollen, tipp ich das auch noch mal in sauber ab und schreib ein paar Kommentare dazu. Sonst setz wenigstens noch folgende Zeile rein, falls Rückfragen kommen:
:: Biberware -- Placed in the Public Domain 2005 -- biber3@hotmail.de

Schönes Rest-Wochenende
Frank / der Biber aus Bremen
Member: theuncle
theuncle Dec 10, 2005 at 15:37:38 (UTC)
Goto Top
Hay Bibber*,

die Tipsdatenbank heisst Maggy und ist eine virtuelle Person in unserer Firma, welche
von uns liebevoll gehegt und gepflegt wird. Ihr Gemütszustand und Ihre Aufnahmebereitschaft
sind demnach untrennbar mit der Laune der Mitarbeiter verbunden.

Weisst ja, wenn jemand Schuld hat .. ist es Maggy .... und NIE ein anderer.
Maggy ist übrigens die Cousine von "Weiss-ICH-NICHT" und "WAR-ICH-NICHT" ... unseren
beiden bestbezahltesten Mitarbeitern face-smile

Sie sind ja auch für die meisten Arbeiten verantwortlich.
So, genug gespammt ...

CU der Tee-Onkel face-wink
Member: xhs-computerman
xhs-computerman Feb 27, 2007 at 10:28:33 (UTC)
Goto Top
Moin-moin,

auch wenn schon etwas Zeit vergangen ist, anbei die Lösung für alle weiteren, die wie ich übrigens auch, nach der Lösung für "mit xcopy nur "nicht vorhandene" Dateien kopieren wollen.

Dein Problem läßt sich mit der Option /d:M-T-J lösen.
Die Option /d kopiert nur die an oder nach einem Datum geänderten Dateien.
Ist kein Datum angegeben, werden nur Dateien kopiert, die neuer als die bestehenden Zieldateien sind. Also: Falls alle Dateien bereits vorhanden sind, werden keine Dateien kopiert.
War das hilfreich ? Mir hat genau diese Funktion bei meinem Problem geholfen...

LG xhs-computerman
Member: Biber
Biber Feb 27, 2007 at 16:47:13 (UTC)
Goto Top
Moin, xhs-computerman,

willkommen im Forum.

Natürlich hast Du Recht mit dem XCopy-Parameter /D, den theUncle ja auch in seiner Eröffnungsfrage erwähnt.

Das Problem in seinem Fall war ja, dass durchaus aktuellere Dateien in der Quelle (der nur teilweise defekten restaurierten Vollsicherung) vorliegen können - neueres Datum, aber ohne Inhalt. Da nützt der /D-Parameter ausnahmsweise nichts, sondern schadet eher.

Für diesen Spezialfall war dieser merkwürdige Workaround.

Grüße
Biber