phsprenger
Goto Top

Von xcopy nicht gefundene Dateien werden nicht protokolliert

Hallo,
mit einem kleinen Batch-Programm versuche ich, eine Liste von Dateien, die in einer TXT-Datei stehen, von A nach B zu kopieren. A und B sind beliebige Verzeichnisse, die man im Vorfeld eingibt oder in einer gesonderten Textdatei speichert. Dieses Problem ist auch an sich gelöst, der Kopiervorgang funktioniert.

Ich will nun auch ein Protokoll in eine Textdatei schreiben, in der für jeden Kopiervorgang festgehalten wird, ob er erfolgreich oder nicht erfolgreich war.

In meinem Testlauf stehen in der Liste 5 zu kopierende Dateien, im angesteuerten Verzeichnis liegen aber nur 3 dieser 5 Dateien (sowie drei andere, die nicht in der Kopierliste stehen).
Wie gewünscht werden die 3 gefundenen Dateien kopiert, die 3 nicht relevanten Dateien ignoriert, die 2 fehlenden Dateien sollen nun eigentlich im Fehlerprotokoll auftauchen ("Datei xy nicht gefunden").

Für die 3 gefundenen Dateien wird im "Fehlerprotokoll" der Erfolg des Kopiervorgangs protokolliert (wäre eigentlich gar nicht nötig, mir würden auch nur die Fehlermeldungen genügen). Die zwei nicht gefundenen Dateien aber tauchen im Protokoll nicht auf!

Ich habe es mit robocoy und xcopy als Kopierbefehl versucht, um vielleicht zu verstehen, was das Problem ist - aber der Effekt ist bei beiden Befehlen der gleiche: das Batchprogramm protokolliert nur die erfolgreichen Kopiervorgänge, nicht die fehlgeschlagenen.

Ich hab verschiedene Lösungsvorschläge aus diesem und anderen Foren ausprobiert, alle ohne Ergebnis. Ich vermute mittlerweile, dass eine nicht gefundene Datei nicht als "Fehler" ausgegeben wird, sondern einfach übersprungen wird. Dafür spricht, dass auch auf dem Bildschirm keine Fehlermeldungen angezeigt werden. Erst wenn ich den Befehl manuell in die Konsole eingebe und eine einzelne Datei kopieren will, die es nicht gibt, wird mir ein Fehler angezeigt.

Wär schön, wenn jemand das Problem erkennt und mir helfen kann - danke sehr!


Zum besseren Verständnis mein Batchprogramm:

@echo off &setlocal

SET "sourceList=Liste.txt"  
SET "logFile=Fehlerprotokoll.txt"  

FOR /f "delims=" %%a IN (Quelle.txt) DO (set sourceRoot=%%a)  
ECHO Die Dateien werden aus dem Verzeichnis %sourceRoot% kopiert

FOR /f "delims=" %%b IN (Ziel.txt) DO (set destFolder=%%b)  
ECHO Die Dateien werden in das Verzeichnis %destFolder% kopiert

PAUSE

:: KOMMENTAR: Variante 1 mit xcopy
FOR /f "delims=" %%i in ('dir /a-d /b /s "%sourceRoot%\*.pdf"^|findstr /ig:"%sourceList%"') DO (xcopy "%%~i" "%destFolder%\") >> %logFile% 2>&1  

:: KOMMENTAR: Variante 2 mit robocopy; in dem Fall ist die oben definierte Variable für das Logfile irrelevant.
FOR /f "delims=" %%i in ('dir /a-d /b /s "%sourceRoot%\*.pdf"^|findstr /ig:"%sourceList%"') DO (robocopy /V "%%~i" "%destFolder%\")  
 

Content-Key: 238806

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

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

Member: Xaero1982
Solution Xaero1982 May 21, 2014 updated at 21:30:17 (UTC)
Goto Top
Nabend,

benutze bitte Codetags: <"code"> <"/code"> ohne "".

Mir ist nicht ganz klar was du da machst...

Du durchsuchst das Quellverzeichnis nach pdf Dateien und diese müssen dann in der besagten "Liste.txt" sein.
Das hat aber zur Folge, dass du nie eine Fehlermeldung bekommen wirst, weil er nur nach Dateien sucht, die tatsächlich auch im Quellverzeichnis vorhanden sind.
Beispiel:

Er durchsucht den Ordner: dir /a-d /b /s "%sourceRoot%\*.pdf
und findet:
1.pdf
2.pdf
3.pdf

In der Liste steht:
1.pdf
2.pdf
3.pdf
4.pdf
5.pdf

Nun guckt er: 1-3.pdf sind alle in der Liste und im Quellordner -> Kopier ich!
Nach 4-5.pdf sucht er gar nicht in der Liste, weil diese nicht im Ordner sind. Ergo: Keine Fehlermeldung.

Du willst ja nur die Dateien kopieren die in der Liste stehen?

Also:
 FOR /f "delims=" %%i in ("%sourceList%") DO (xcopy "%sourceRoot%\%%~i" "%destFolder%\") >> %logFile% 2>&1  

Gruß
edit: Dein Nick erinnert mich an meinen Ausbilder face-smile
Member: bastla
Solution bastla May 21, 2014 updated at 21:30:24 (UTC)
Goto Top
Hallo phsprenger und willkommen im Forum!

Deine Interpretation
Ich vermute mittlerweile, dass eine nicht gefundene Datei nicht als "Fehler" ausgegeben wird, sondern einfach übersprungen wird.
ist völlig zutreffend -
dir /a-d /b /s "%sourceRoot%\*.pdf"
liefert ja schließlich nur "gefundene" Dateien, und erst das anschließende Filtern legt fest, ob die Datei auch kopiert werden soll.

Wenn Du alle Dateien aus "Liste.txt" kopieren bzw deren Fehlen feststellen willst, musst Du eher so vorgehen (ungetestet):
for /f "usebackq delims=" %%i in ("%sourceList%") do (  
    set "Gefunden="  
    for /f "delims=" %%a in ('dir /s/b/a-d "%sourceRoot%\%%i"') do (  
        set Gefunden=true
        xcopy "%%a" "%destFolder%\" 2>>"%logFile%"  
    )
    if not defined Gefunden >>"%logFile%" echo "%%i" nicht gefunden  
)
Falls übrigens "Liste.txt" nur Dateinamen, nicht aber auch den Typ (.pdf) enthalten sollte, wäre entsprechend "%sourceRoot%\%%i.pdf" zu verwenden ...

Grüße
bastla
Member: phsprenger
phsprenger May 21, 2014 at 21:21:35 (UTC)
Goto Top
Super Hinweis, Danke! So funktionierts.

Hab das letzte Mal zu DOS-Zeiten sehr simple Batch-Dateien geschrieben und mir den Code da oben mehr oder weiger zusammengesucht. Dass die Logik genau verkehrt herum ist ist mir nicht aufgefallen - aber vollkommen einleuchtend, wenn man genau hinguckt. Da meine Dateien aber ja immer brav kopiert wurden(und die NICHT in der Liste stehenden Dateien auch ignoriert wurden) hab ich den Fehler an der Stelle überhaupt nicht gesucht.

Danke für die Hinweise und Hilfe, bastla und Xaero1982 - jetzt klappts auch!!!
Member: Xaero1982
Xaero1982 May 21, 2014 updated at 21:39:52 (UTC)
Goto Top
Super, dann noch auf gelöst setzen und Bastla und ich freuen uns auch auf ein Klick wenns zur Lösung beigetragen hat face-smile

Gruß
edit: Schön, dass du ihn doch wieder freigegeben hast face-smile