secuencia de comandos por lotes

secuencia de comandos por lotes

¿Cómo mover archivos a una carpeta hasta que alcance cierto tamaño en Windows?

Respuesta1

secuencia de comandos por lotes

Aquí hay un guión que hace precisamente eso. Tiene cuatro parámetros, siendo el último opcional: la carpeta de origen; la carpeta de destino; el tamaño objetivo en bytes; las extensiones de archivo que deben coincidir. Todos los parámetros excepto el tamaño requieren comillas.

@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

Cómo funciona

Las primeras líneas aseguran que la cantidad de parámetros sea correcta. Cada parámetro se valida para rechazar carpetas no existentes y/o valores de tamaño incorrectos. Para evitar el desbordamiento de enteros, se truncan los últimos 3 dígitos del tamaño objetivo. Se establece un valor umbral en 1/1000 del objetivo para proporcionar cierta tolerancia.

Para tener en cuenta los archivos existentes, se escanea el contenido de la carpeta de destino y se calcula su tamaño total. El valor resultante se resta del tamaño objetivo.

En este punto comienza el trabajo real: el contenido de la carpeta de origen se enumera y ordena por tamaño de archivo, de mayor a menor. Los archivos se mueven sólo cuando su tamaño es menor o igual al objetivo actual, que luego se actualiza. Estebúsqueda codiciosacontinúe hasta que no haya más archivos o se alcance el umbral mínimo, lo que ocurra primero.

Observaciones

  • El intérprete de comandos utiliza 32 bits.enteros con signopara realizar operaciones aritméticas, por lo tanto, el valor positivo más alto es 2^31 - 1 = 2147483647.

  • El tamaño de destino puede ser cualquier valor (en bytes) entre 1 KB y 2 TB.

  • Los archivos con el conjunto de atributos Oculto o Sistema se ignoran.

  • En caso de que la carpeta de origen contenga uno o más archivos que ya estén presentes en la carpeta de destino, se omitirá la operación de movimiento para evitar una posible pérdida de datos.

  • Por motivos de rendimiento, el script utilizó un valor almacenado en caché en lugar de enumerar archivos en cada paso para encontrar el tamaño de la carpeta de destino. Los archivos que se omiten porque comparten el mismo nombre se sumarán al total y el tamaño resultante puede verse sesgado.

  • Las subcarpetas no se procesan. Si es necesario, agregue el /sparámetro al dircomando. Dado que la estructura de origen se aplana, es posible que termine con archivos con nombres idénticos que no se moverían al destino.

Otras lecturas

Respuesta2

Con Powershell.

Hacer (el movimiento de los archivos de una carpeta a otra) mientras (el tamaño de la carpeta no es el deseable)

Usaresta demostración sobre cómo usar el bucle do whiley cambie el script de eco con los scripts anteriores para adaptarlo a sus necesidades.

información relacionada