Batch-Skript

Batch-Skript

Wie verschiebe ich Dateien in einen Ordner, bis dieser in Windows eine bestimmte Größe erreicht?

Antwort1

Batch-Skript

Hier ist ein Skript, das genau das tut. Es hat vier Parameter, von denen der letzte optional ist: der Quellordner; der Zielordner; die Zielgröße in Bytes; die Dateierweiterungen, die übereinstimmen sollen. Alle Parameter außer der Größe erfordern Anführungszeichen.

@echo off
setlocal
setlocal enabledelayedexpansion

if "%~3" == "" exit /b 3
if "%~2" == "" exit /b 2
pushd "%~1" 2>nul || exit /b 4
pushd "%~2" 2>nul && popd || exit /b 5

set target=%~3
set /a target=%target:~0,-3% 2>nul || exit /b 6
set /a min=%target% / 1000

for /r "%~2" %%G in (*) do (
set size=%%~zG
set /a size=!size:~0,-3! 2>nul
if !errorlevel! equ 0 (
if !size! gtr !target! exit /b 7
set /a target -= !size!
))

if %target% leq %min% goto :end
set exts=* & if not "%~4" == "" set exts=%~4

for /f "delims=" %%G in ('dir %exts% /a:-d-h-s /b /o:-s 2^>nul') do (
if !target! leq %min% goto :end
set size=%%~zG
set /a size=!size:~0,-3! 2>nul
if !errorlevel! equ 0 if !size! leq !target! (
echo n 2>nul|move /-y "%%~fG" "%~2" >nul 2>&1 && set /a target -= !size!
))
:end
popd
endlocal & exit /b 0

Wie es funktioniert

Die ersten Zeilen stellen sicher, dass die Anzahl der Parameter korrekt ist. Jeder Parameter wird überprüft, um nicht vorhandene Ordner und/oder falsche Größenwerte abzulehnen. Um einen Ganzzahlüberlauf zu vermeiden, werden die letzten 3 Ziffern der Zielgröße abgeschnitten. Ein Schwellenwert wird auf 1/1000 des Ziels festgelegt, um eine gewisse Toleranz zu gewährleisten.

Um vorhandene Dateien zu berücksichtigen, wird der Inhalt des Zielordners gescannt und seine Gesamtgröße berechnet. Der resultierende Wert wird von der Zielgröße abgezogen.

An diesem Punkt beginnt die eigentliche Arbeit: Der Inhalt des Quellordners wird aufgelistet und nach Dateigröße sortiert, von der größten zur kleinsten. Dateien werden nur verschoben, wenn ihre Größe kleiner oder gleich der des aktuellen Ziels ist, das dann aktualisiert wird. Diesgierige SucheFahren Sie fort, bis keine Dateien mehr vorhanden sind oder der Mindestschwellenwert erreicht ist, je nachdem, was zuerst eintritt.

Bemerkungen

  • Der Befehlsinterpreter verwendet 32-Bitvorzeichenbehaftete Ganzzahlenum arithmetische Operationen durchzuführen, daher ist der höchste positive Wert 2^31 - 1 = 2147483647.

  • Die Zielgröße kann jeder beliebige Wert (in Bytes) zwischen 1 KB und 2 TB sein.

  • Dateien mit dem Attribut „Versteckt“ oder „System“ werden ignoriert.

  • Falls der Quellordner eine oder mehrere Dateien enthält, die bereits im Zielordner vorhanden sind, wird der Verschiebevorgang übersprungen, um einen möglichen Datenverlust zu vermeiden.

  • Aus Leistungsgründen verwendete das Skript einen zwischengespeicherten Wert, anstatt bei jedem Schritt Dateien aufzuzählen, um die Größe des Zielordners zu ermitteln. Dateien, die übersprungen werden, weil sie denselben Namen haben, werden dennoch zur Gesamtsumme addiert, und die resultierende Größe kann das Ergebnis verfälschen.

  • Unterordner werden nicht verarbeitet. Fügen Sie den Parameter bei Bedarf /sdem dirBefehl hinzu. Da die Quellstruktur abgeflacht wird, erhalten Sie möglicherweise identisch benannte Dateien, die nicht in das Ziel verschoben werden.

Weiterführende Literatur

Antwort2

Mit Powershell.

Tun (das Verschieben der Dateien von einem Ordner in einen anderen) während (die Größe des Ordners ist nicht die gewünschte)

Verwendendiese Demo zur Verwendung der do while-Schleifeund ändern Sie das Echo-Skript mit den obigen Skripten entsprechend Ihren Anforderungen.

verwandte Informationen