Verschieben von bestimmter Anzahl von Dateien aus vollem Ordner dauert zu lange
Hallo zusammen,
ich hoffe ihr könnt mir helfen, ich bin nach langer Zeit mal wieder im Batch-Umfeld unterwegs (sonst eher C# u.ä.) und benötige ein Script, mit dessen Hilfe ich eine bestimmte Anzahl von Dateien von einem in ein anderes Verzeichnis verschiebe. Wichtig ist, dass immer die ältesten zuerst verschoben werden. Wenn die definierte Anzahl an Files verschoben wurde, soll das Script beendet werden.
Mein Lösung (siehe unten) verschiebt zwar die gewünschten Files in das gewünschte Verzeichnis, läuft aber danach noch lange weiter, da das Ausgangsverzeichnis sehr voll ist und der ELSE-Zweig mit dem goto :eof nicht greift. Ich hoffe auf eure Hilfe...
Wie kann ich das besser lösen? Wo ist der Fehler im Ansatz? Könnt ihr mich anschubsen?
Danke für die Hilfe und viele Grüße
ich hoffe ihr könnt mir helfen, ich bin nach langer Zeit mal wieder im Batch-Umfeld unterwegs (sonst eher C# u.ä.) und benötige ein Script, mit dessen Hilfe ich eine bestimmte Anzahl von Dateien von einem in ein anderes Verzeichnis verschiebe. Wichtig ist, dass immer die ältesten zuerst verschoben werden. Wenn die definierte Anzahl an Files verschoben wurde, soll das Script beendet werden.
Mein Lösung (siehe unten) verschiebt zwar die gewünschten Files in das gewünschte Verzeichnis, läuft aber danach noch lange weiter, da das Ausgangsverzeichnis sehr voll ist und der ELSE-Zweig mit dem goto :eof nicht greift. Ich hoffe auf eure Hilfe...
set StartFolder=C:\DATA\Test\
set TargetFolder="C:\DATA\Test2\"
set SearchString="Update*.xml"
set Found=""
set /a Numbers=1
set Count=1000
FOR /F "delims=" %%z IN ('dir %StartFolder%%SearchString% /OD /B') Do @(
IF %Numbers% LEQ %Count% (
call :MoveFile "%%z"
) ELSE ( GOTO :EOF )
)
:MOVEFile
SET Found="%~1"
IF %Numbers% LEQ %Count% (MOVE %StartFolder%%Found% %TargetFolder%
SET /a Numbers= %Numbers%+1 )
Wie kann ich das besser lösen? Wo ist der Fehler im Ansatz? Könnt ihr mich anschubsen?
Danke für die Hilfe und viele Grüße
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 263988
Url: https://administrator.de/contentid/263988
Ausgedruckt am: 25.11.2024 um 08:11 Uhr
2 Kommentare
Neuester Kommentar
Hallo mkdeluxe.
Ungetestet:
Grüße
rubberman
- Die FOR /F Schleife puffert zunächst die gesamte Ausgabe des DIR Befehls, bevor der Schleifenrumpf überhaupt abgearbeitet wird. Das wirst du nicht vermeiden können, da du die Ausgabe mit /OD vorsortiert haben möchtest.
- Der Aufruf einer Subroutine kostet Zeit. Wenn du alles im Schleifenrumpf abarbeitest, wird das etwas schneller gehen.
- Variablen werden in einer Kommandozeile oder einem (in Klammern eingeschlossenen) Block von Kommandozeilen nur einmal zum Wert erweitert, und zwar noch vor der Abarbeitung dieses Codes. Dein Schleifenrumpf ist so ein Block, deshalb bleibt %Numbers% beim Vergleich auch immer 1. Die "Verzögerte Variablenerweiterung" schafft Abhilfe.
Ungetestet:
@echo off &setlocal
set "StartFolder=C:\DATA\Test\"
set "TargetFolder=C:\DATA\Test2\"
set "SearchString=Update*.xml"
set /a "Numbers=1, Count=1000"
for /F "delims=" %%z in ('dir "%StartFolder%%SearchString%" /OD /B') do (
set "Found=%%z"
setlocal EnableDelayedExpansion
if !Numbers! LEQ !Count! (
move "!StartFolder!!Found!" "!TargetFolder!"
) else (
goto :EOF
)
endlocal
set /a "Numbers += 1"
)
Grüße
rubberman