Nur kopierte Dateien in Datei ausgeben bzw. loggen
Hallo zusammen,
ich habe ein Skript, welches mir bestimmte Dateien kopiert.
Nun habe ich eine weitere Anforderung. Ich möchte die Dateien nur EINMAL kopieren, daher dachte ich, dass ich xcopy /EXCLUDE einsetze.
D.h. über xcopy /exclude:exclude.txt && echo %%i.txt >> exlucde.txt
wobei %%i.txt die gefundenen Text-Dateien sind.
Das funktioniert im Prinzip auch, leider schreibt er aber immer die gefundenen DAteien in die Datei exclude.txt. Ich möchte aber, dass die Dateien nur in die exclude.txt geschrieben werden, wenn die Datei auch kopiert wird, sonst hab ich sie ja zig mal drin stehen.
Hab mit errorlevel experimentiert, aber komme nicht hin (errorlevel ist immer 0).
Beispiel:
1.Durchlauf
3 gefunden Dateien 123456.txt, 234567.txt, 345678.txt
=> sollen kopiert werden
=> Dateinamen sollen zusätzlich in exclude.txt geschrieben werden
2.Durchlauf
3 gefunden Dateien 123456.txt, 234567.txt, 345678.txt (also keine neuen!)
=> sollen nicht kopiert werden (Ausschluss über exclude.txt)
=> Dateinamen sollen NICHT in exclude.txt geschrieben werden
3.Durchlauf
4 gefunden Dateien 123456.txt, 234567.txt, 345678.txt, 456789.txt (also 1 neue!)
=> 456789.txt soll kopiert werden (die anderen Ausschluss über exclude.txt)
=> nur Dateiname 456789.txt sollen in exclude.txt geschrieben werden
Hier mein bisheriger Code (der aber jedesmal in die exclude.txt schreibt):
Danke!!
ich habe ein Skript, welches mir bestimmte Dateien kopiert.
Nun habe ich eine weitere Anforderung. Ich möchte die Dateien nur EINMAL kopieren, daher dachte ich, dass ich xcopy /EXCLUDE einsetze.
D.h. über xcopy /exclude:exclude.txt && echo %%i.txt >> exlucde.txt
wobei %%i.txt die gefundenen Text-Dateien sind.
Das funktioniert im Prinzip auch, leider schreibt er aber immer die gefundenen DAteien in die Datei exclude.txt. Ich möchte aber, dass die Dateien nur in die exclude.txt geschrieben werden, wenn die Datei auch kopiert wird, sonst hab ich sie ja zig mal drin stehen.
Hab mit errorlevel experimentiert, aber komme nicht hin (errorlevel ist immer 0).
Beispiel:
1.Durchlauf
3 gefunden Dateien 123456.txt, 234567.txt, 345678.txt
=> sollen kopiert werden
=> Dateinamen sollen zusätzlich in exclude.txt geschrieben werden
2.Durchlauf
3 gefunden Dateien 123456.txt, 234567.txt, 345678.txt (also keine neuen!)
=> sollen nicht kopiert werden (Ausschluss über exclude.txt)
=> Dateinamen sollen NICHT in exclude.txt geschrieben werden
3.Durchlauf
4 gefunden Dateien 123456.txt, 234567.txt, 345678.txt, 456789.txt (also 1 neue!)
=> 456789.txt soll kopiert werden (die anderen Ausschluss über exclude.txt)
=> nur Dateiname 456789.txt sollen in exclude.txt geschrieben werden
Hier mein bisheriger Code (der aber jedesmal in die exclude.txt schreibt):
@Echo off
Set "Base=C:\temp\csv\source"
Set "Target=C:\temp\csv\target"
Set "LogFile=exclude.txt"
pushd %base%
if not exist %LogFile% copy NUL %LogFile%
For /f "delims=" %%i in ('Dir /B/AD /O-D ?????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9][0-9]$"') Do (
if Exist "%%i\Fehler\%%i.txt" xcopy "%%i\Fehler\%%i.txt" %target% /d /exclude:%LogFile% && if %errorlevel% == 0 echo %%i.txt >> %LogFile%
)
Danke!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 143213
Url: https://administrator.de/contentid/143213
Ausgedruckt am: 25.11.2024 um 21:11 Uhr
13 Kommentare
Neuester Kommentar
Sollen die Dateien nur kopiert werden wenn sie verändert wurden bzw. neu sind? Dann wäre es ganz einfach mit hinzubekommen. macht einen Spiegel der Quelldateien ins Zielverzeichnis. Es gibt allerdings noch viele weitere Schalter, die dir evtl. behilflich sein könnten. Vllt. hilft dir das weiter.
P.S.: Bitte formatiere deinen Code noch mit den dafür vorgesehenen , s. Formatierungshilfe.
robocopy /MIR
/MIR
P.S.: Bitte formatiere deinen Code noch mit den dafür vorgesehenen , s. Formatierungshilfe.
Hallo LPRathmann!
Abgesehen davon, dass wegen des "
Was ist eigentlich das genaue Ziel der Aktion? Ein neuerliches Kopieren der bereits im Zielordner vorhandenen Dateien erfolgt ja wegen des "/d" ohnehin nur, wenn die Quelldatei zwischenzeitlich verändert wurde und daher neuer ist; zudem könntest Du ja auch einfach per "
Grüße
bastla
Abgesehen davon, dass wegen des "
&&
" das folgende "if %errorlevel% == 0
" ohnehin sinnlos ist, kann das innerhalb der Schleife gar nicht wie gewünscht funktionieren (Stichwort "delayedexpansion") - allenfalls wäre noch "if not errorlevel 1
" eine Alternative (aber genauso unnötig), daher sollte reichen:if Exist "%%i\Fehler\%%i.txt" xcopy "%%i\Fehler\%%i.txt" "%target%" /d /exclude:"%LogFile%" && echo %%i.txt>>"%LogFile%"
if exist
" prüfen, ob es die zu kopierende Datei im Zielordner bereits gibt ...Grüße
bastla
Hallo LPRathmann!
Wenn ich das richtig verstehe sollen also alle Dateien also nur genau einmal kopiert werden (unabhängig davon, ob sie nachträglich noch verändert wurden) - in diesem Fall würde ich das (ungetestet) so versuchen:
Grüße
bastla
Bei Deinem Skript werden die Dateien aber doch immer in die Log-Datei geschrieben, unabhängig davon, ob kopiert wird oder nicht.
Mein Script ist eigentlich zunächst nur eine Korrektur zu Deinem Ansatz - die Abfrage von %errorlevel% in Deiner Version liefert aus zwei Gründen immer 0: Erstens, weil das "&&" vorweg schon den Errorlevel checkt und nur, wenn dieser 0 ist (also "xcopy
" ohne Fehler beendet wurde), den Rest der Zeile ausführt, und zweitens, weil innerhalb der Schleife %errorlevel% immer den Wert liefert, der bereits vor der Schleife enthalten war (gilt auch für andere Variable, wenn keine "delayedExpansion" verwendet wird).Wenn ich das richtig verstehe sollen also alle Dateien also nur genau einmal kopiert werden (unabhängig davon, ob sie nachträglich noch verändert wurden) - in diesem Fall würde ich das (ungetestet) so versuchen:
@echo off & setlocal
Set "Base=C:\temp\csv\source"
Set "Target=C:\temp\csv\target"
Set "LogFile=exclude.txt"
pushd %base%
if not exist %LogFile% copy NUL %LogFile%
for /f "delims=" %%i in ('Dir /B/AD /O-D ?????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9][0-9]$"') Do (
if exist "%%i\Fehler\%%i.txt" findstr /i /x /c:"%%i.txt" "%LogFile%" || (copy "%%i\Fehler\%%i.txt" %target% >nul && >>"%LogFile%" echo %%i.txt)
)
popd
bastla
Hallo LPRathmann!
Da "/d" als Schalter für "
eine Alternative ...
[Edit]
Um aber auch Deinen ursprünglichen Plan nochmals aufzugreifen:
sollte auch klappen - wenn es auch hässlich ist, bei jedem (versuchten) Kopiervorgang einen Eintrag der Art
zu erhalten (zum Wegfiltern wäre allerdings schon wieder einn "
[/Edit]
Grüße
bastla
Das /x bei findstr war schuld
Du hast ja fixe Namensstrukturen (6 Zeichen numerisch) und kannst daher tatsächlich darauf verzichten, da nicht zu befürchten ist, dass ein Teilstring als Treffer gewertet wird (weil zB "11333.txt" in "111333.txt" enthalten wäre); trotzdem funktioniert bei meinem (inzwischen vorgenommenen Test) auch der Vergleich der kompletten Zeile ...Da "/d" als Schalter für "
xcopy
" nicht in Frage kommt: Könnte ev das "Archiv"-Attribut genutzt werden, bzw anders formuliert: Werden die Dateien, nachdem sie einmal kopiert wurden, noch verändert? Falls es keine Veränderung gibt (und das Script vor dem täglichen Backup, welches vermutlich das Archivbit zurücksetzt, ausgeführt wird), wäre einxcopy /m ...
[Edit]
Um aber auch Deinen ursprünglichen Plan nochmals aufzugreifen:
xcopy "%%i\Fehler\%%i.txt" "%target%\" /y /exclude:"%LogFile%" >>"%LogFile%"
1 Datei(en) kopiert
find
" oder "findstr
" nötig, also etwa:xcopy "%%i\Fehler\%%i.txt" "%target%\" /y /exclude:"%LogFile%"|findstr /v /c:"Datei(en) kopiert" >>"%LogFile%"
Grüße
bastla