Script em lote

Script em lote

Como mover arquivos para uma pasta até atingir um determinado tamanho no Windows?

Responder1

Script em lote

Aqui está um script que faz exatamente isso. Possui quatro parâmetros, sendo o último opcional: a pasta de origem; a pasta de destino; o tamanho do destino em bytes; as extensões de arquivo que devem ser correspondidas. Todos os parâmetros, exceto o tamanho, exigem cotações.

@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

Como funciona

As primeiras linhas garantem que a quantidade de parâmetros esteja correta. Cada parâmetro é validado para rejeitar pastas inexistentes e/ou valores de tamanho incorretos. Para evitar estouro de número inteiro, os últimos três dígitos do tamanho do destino são truncados. Um valor limite é definido como 1/1000 da meta para fornecer alguma tolerância.

Para contabilizar os arquivos existentes, o conteúdo da pasta de destino é verificado e seu tamanho total é calculado. O valor resultante é subtraído do tamanho alvo.

Neste ponto, o trabalho propriamente dito começa: o conteúdo da pasta de origem é enumerado e classificado por tamanho de arquivo, do maior para o menor. Os arquivos são movidos somente quando seu tamanho é menor ou igual ao destino atual, que é então atualizado. Essebusca gananciosacontinue até que não haja mais arquivos ou o limite mínimo seja atingido, o que ocorrer primeiro.

Observações

  • O interpretador de comandos usa 32 bitsinteiros assinadospara realizar operações aritméticas, portanto, o maior valor positivo é 2^31 - 1 = 2147483647.

  • O tamanho de destino pode ser qualquer valor (em bytes) entre 1 KB e 2 TB.

  • Arquivos com o conjunto de atributos Oculto ou Sistema são ignorados.

  • Caso a pasta de origem contenha um ou mais arquivos que já estejam presentes na pasta de destino, a operação de movimentação será ignorada para evitar possível perda de dados.

  • Por motivos de desempenho, o script usou um valor armazenado em cache em vez de enumerar arquivos em cada etapa para encontrar o tamanho da pasta de destino. Os arquivos que são ignorados porque compartilham o mesmo nome ainda serão somados ao total, e o tamanho resultante pode ser distorcido.

  • As subpastas não são processadas. Se necessário, adicione o /sparâmetro ao dircomando. Como a estrutura de origem fica nivelada, você pode acabar com arquivos com nomes idênticos que não seriam movidos para o destino.

Leitura adicional

Responder2

Com Powershell.

Fazer (a movimentação dos arquivos de uma pasta para outra) enquanto (o tamanho da pasta não é o desejável)

Usaresta demonstração sobre como usar o loop do whilee altere o script de eco pelos scripts acima para atender às suas necessidades.

informação relacionada