bastler2000
Goto Top

Batch Datei die nur Daten ab bestimmter Grösse kopiert.

Hallo an alle Forumnutzer.
Ich komme mal direkt zur Sache.
Habe Probleme bei meiner Batch Datei ( bin noch Anfänger). Es soll später unter windows 7 laufen.

Also, die Batch Datei kopiert *.doc und *.txt Dateien in einen Backupordner, das klappt auch alles ganz gut.
Jedoch bräuchte ich einen Filter der nur Dateien ab einer bestimmten Dateigrösse kopiert,
z.B: ab 100kb kopiert der und kleinere lässt der liegen.
hoffe meine Beschreibung ist verständlich bin ja noch nicht so im Thema, wobei nach der Googelei müsste schon was hängen geblieben sein ;).
Hier mein Code:
@echo off
xcopy "C:\*.txt" %~d0\backup_a /s/c/q/r/h
xcopy "D:\*.doc" %~d0\backup_b /s/c/q/r/h
@cls
@ExIT

habe nach div. Suche folgende Ansätze gefunden. kann jedoch leider keine Verbindung aufbauen, ging meistens ums löschen von temp Dateien.
anbei die Ansätze:

1.)

@echo off & setlocal
set "List=D:\Log.txt"
set "Size=80000"
if exist "%List%" del "%List%"
for %%i in (*.jpg) do if %%~zi geq %Size% echo %%i>>"%List%"

2.)
if ($filename = 'clicks.txt'){
echo $filename . ': ' . filesize($filename) . '0';
copy("sicherungclicks.txt","clicks.txt");
}
?>

Wenn Jemand einen Tip hat wäre das total toll.
Danke
MfG

Content-Key: 159894

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

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

Member: bastla
bastla Feb 01, 2011 at 15:02:47 (UTC)
Goto Top
Hallo bastler2000 und willkommen im Forum!

Die Version 1 müsstest Du (ungetestet) etwa so abwandeln:
@echo off & setlocal
set "Size=80000"  

for /f "delims=" %%i in ('dir /s /b D:\*.txt') do if %%~zi geq %Size% xcopy "%%i" "%~d0\backup_a%%~pnxi*" /cqrh  
for /f "delims=" %%i in ('dir /s /b D:\*.doc') do if %%~zi geq %Size% xcopy "%%i" "%~d0\backup_b%%~pnxi*" /cqrh  
[Edit2] Als Ergänzung (und immer noch ungetestet face-wink): Soferne nur relative Pfade "mitgenommen" werden sollen, etwa so:
@echo off & setlocal
set "Basis=D:\Test"  
set "Size=80000"  

for /f "delims=" %%i in ('dir /s /b "%Basis%\*.txt"') do if %%~zi geq %Size% call :ProcessFile "%%i" "%~d0\backup_a"  
for /f "delims=" %%i in ('dir /s /b "%Basis%\*.doc"') do if %%~zi geq %Size% call :ProcessFile "%%i" "%~d0\backup_b"  
goto :eof

:ProcessFile
set "Quellpfad=%~f1"  
call set "RelPfad=%%Quellpfad:%Basis%=%%  
xcopy %1 "%~2%RelPfad%*" /cqrh  
goto :eof
[/Edit2]

Grüße
bastla

[Edit] Hatte übersehen, dass in unterschiedliche Zielordner kopiert und wohl auch der Pfad übernommen werden soll [/Edit]
Member: Snowman25
Snowman25 Feb 01, 2011 at 16:19:54 (UTC)
Goto Top
Hallo @bastler2000,

Kennst du Robocopy?
Ab Vista ist es standardmäßig installiert. Bei Robocopy gibt es einen Switch namens /MIN:n. Dieser schließt von einem Kopiervorgang alles aus, was kleiner als deine angegebene Größe ist!

Zitat von robocopy
/MIN:n :: Minimale Dateigröße - schließt Dateien aus, die kleiner als n Bytes sind.

Gruß
Snow
Member: bastler2000
bastler2000 Feb 01, 2011 at 16:43:15 (UTC)
Goto Top
Vielen Dank für die schnelle Antwort. Werde das heute abend mal testen. melde mich dann obs geklappt hat. face-smile
Member: bastla
bastla Feb 01, 2011 at 20:31:20 (UTC)
Goto Top
[OT] @snow
Spielverderber ... face-wink

Grüße
bastla
[/OT]
Member: bastler2000
bastler2000 Feb 02, 2011 at 15:00:33 (UTC)
Goto Top
Hi wieder da .
@ bastla
habe den code etwas abgewandelt verwendet, jedoch habe ich leider festellen müssen, dass das Kopieren damit sehr viel länger dauert und er trotzdem alles kopiert.
Zum Testen habe ich 2 Ordner erstellt und der soll von A-B kopieren mit dem besagten Filter. ( um die Methode zu verstehen).
Hast du evtl Lust für dieses Beispiel einen Einfachen Beispielcode zu schreiben.

Hatte nun mit einer \Exclude *.txt gearbeitet, ist nur nicht so optimal. Würde mich interessiern wie das Andere klappt ;)


@ snowman
habe leider noch PC´s mit Winxp im Haushalt
Member: bastla
bastla Feb 02, 2011 at 16:00:34 (UTC)
Goto Top
Hallo bastler2000!

Leider kann ich Dir nicht so ganz folgen ...

Der einfache Beispielcode für das Kopieren von *.txt-Dateien und *.doc-Dateien mit einer Größe von mindestens 80.000 Bytes steht oben, und damit werden auch nicht alle, sondern nur die entsprechenden Dateien kopiert. Wenn Du das für die Ordner A und B benötigst, solltest Du (im zweiten Ansatz) die Zeilen 2 sowie 5 und 6 anpassen ...

Das das Kopieren bei Überprüfung jeder einzelnen Dateigröße durch einen Batch vergleichsweise langsam ist, kannst Du nur durch Verwendung eines effizienteren Werkzeuges ändern - zB, indem Du Dir "robocopy" besorgst (gibt's auch für XP und als Download bei Microsoft) ...

Grüße
bastla
Member: bastler2000
bastler2000 Feb 03, 2011 at 22:03:34 (UTC)
Goto Top
Hi vielen Dank für die Mühe und den super Code, habe diesen zuvor falsch angepasst, dadurch ist der sehr langsam geworden und hat nicht richtig gefiltert. face-sad
Habe den fehler gefunden und siehe da: das Filtern klappt vorzüglich.
Der Code wurde dann von mir geändert damit er aus 2 verschiedenen Ordnern die Daten sucht, anhand der Grösse filtert und dann in einem gemeinsamen Ordner kopiert.
Leider klappt das mit dem Filtern nur für Ordner a, bei Ordner b kopiert der einfach alles. Ich weiss nicht sorecht wo der Fehler ist.
Anbei der Code:

@echo off & setlocal

set "Basis_a=C:\Users\Meister\Desktop\a"
set "Basis_b=C:\Users\Meister\Desktop\b"
set "Size=80000"

for /f "delims=" %%i in ('dir /s /b "%Basis_a%\*.doc"') do if %%~zi geq %Size% call :ProcessFile_a "%%i" "%~d0\backup_ab"
for /f "delims=" %%i in ('dir /s /b "%Basis_b%\*.txt"') do if %%~zi geq %Size% call :ProcessFile_b "%%i" "%~d0\backup_ab"

goto :eof

:ProcessFile_a
set "Quellpfad=%~f1"
call set "RelPfad=%%Quellpfad:%Basis_a%=%%

xcopy %1 "%~2%RelPfad%*" /cqrh
goto :eof

:ProcessFile_b
set "Quellpfad=%~f1"
call set "RelPfad=%%Quellpfad:%Basis_b%=%%

xcopy %1 "%~2%RelPfad%*" /cqrh
goto :eof
Member: bastla
bastla Feb 03, 2011 at 22:38:07 (UTC)
Goto Top
Hallo bastler2000!

Abgesehen davon, dass in meinem Ansatz oben noch ein Anführungszeichen gefehlt hat, sollte es bei praktischen identischen Codeteilen "alles oder nix" heißen - mit der folgenden Variante dann hoffentlich "alles" face-wink:
@echo off & setlocal

set "Basis_a=C:\Users\Meister\Desktop\a"  
set "Basis_b=C:\Users\Meister\Desktop\b"  
set "Size=80000"  

for /f "delims=" %%i in ('dir /s /b "%Basis_a%\*.doc"') do if %%~zi geq %Size% call :ProcessFile "%%i" "%~d0\backup_ab" "%Basis_a%"  
for /f "delims=" %%i in ('dir /s /b "%Basis_b%\*.txt"') do if %%~zi geq %Size% call :ProcessFile "%%i" "%~d0\backup_ab" "%Basis_b%"  

goto :eof

:ProcessFile
set "Quellpfad=%~f1"  
call set "RelPfad=%%Quellpfad:%~3=%%"  

xcopy %1 "%~2%RelPfad%*" /cqrh >nul  
goto :eof
Da die Ermittlung des relativen Pfades und das Kopieren ja nach dem selben Schema erfolgen, sollte ein Unterprogramm (dem die erforderlichen Parameter - als %1 bis %3 - übergeben werden) eigentlich genügen ...

Grüße
bastla

P.S.: Code als formatiert zu posten ist übrigens gar nicht schwer ...
Member: bastler2000
bastler2000 Feb 03, 2011 at 23:12:39 (UTC)
Goto Top
Hallo Danke für die schnelle Antwort.
habe den Code getestet. Jedoch wird nur der Inhalt des Ordners a gefiltert der Inhalt des Ordner b wird komplett kopiert.
Habe mir in Ordner a und b verschieden grosse Dateien gelegt um die Funktion zu testen.
Habe mich schon gefragt wie alle den Code so schön formatiert ins Forum stellen können.
grüsse
Member: bastla
bastla Feb 03, 2011 at 23:18:39 (UTC)
Goto Top
Hallo bastler2000!

Sorry - ich habe den Code vor dem Posten getestet und er macht bei mir, was er soll ...

Grüße
bastla
Member: bastler2000
bastler2000 Feb 03, 2011 at 23:35:17 (UTC)
Goto Top
Hi ,
Ich fühle mich wie auf wolke 7. Sitze schon fast den halben Tag daran und jetzt geht es: tja Dicker kopf und ne menge byte, bit, kilobit, kilobyte..... hatte den Filterwert zu niedrig gewählt und die Dateien im Ordner b zu hoch ;).
Vielen Vielen Dank bastla
Jetzt kann ich endlich schlafen gehen.
Member: bastler2000
bastler2000 Feb 04, 2011 at 00:34:04 (UTC)
Goto Top
Tja immernoch an der Kiste.
Was müsste ich denn in Zeile 12-16 ändern wenn ich 3 Quellen anstatt 2 wählen würde?
lg
Member: bastla
bastla Feb 04, 2011 at 07:02:36 (UTC)
Goto Top
Hallo bastler2000!
Was müsste ich denn in Zeile 12-16 ändern wenn ich 3 Quellen anstatt 2 wählen würde?
Die gute Nachricht zum Tage: gar nix face-wink (es werden ja alle relevanten Informationen - zu kopierende Datei, Zielpfad und (Quell-)Basispfad - beim Aufruf des Unterprogramms übergeben ...)

Grüße
bastla
Member: bastler2000
bastler2000 Feb 04, 2011 at 16:35:13 (UTC)
Goto Top
Hallo bastla,
habe gerade nach dem Muster von Zeile 7/8 neue ordner erstellt klapp! face-smile
Danke