배치 스크립트

배치 스크립트

Windows에서 파일이 특정 크기에 도달할 때까지 폴더로 파일을 이동하는 방법은 무엇입니까?

답변1

배치 스크립트

여기에 바로 그 일을 하는 스크립트가 있습니다. 여기에는 4개의 매개변수가 있으며 마지막 매개변수는 선택사항입니다. 소스 폴더; 대상 폴더; 바이트 단위의 목표 크기; 일치해야 하는 파일 확장자. 크기를 제외한 모든 매개변수에는 따옴표가 필요합니다.

@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

작동 원리

첫 번째 줄은 매개변수의 양이 올바른지 확인합니다. 존재하지 않는 폴더 및/또는 잘못된 크기 값을 거부하기 위해 각 매개변수의 유효성이 검사됩니다. 정수 오버플로를 방지하기 위해 대상 크기의 마지막 3자리가 잘립니다. 어느 정도 허용 오차를 제공하기 위해 임계값은 목표의 1/1000로 설정됩니다.

기존 파일을 계산하기 위해 대상 폴더의 내용을 검사하고 전체 크기를 계산합니다. 결과 값은 대상 크기에서 뺍니다.

이 시점에서 실제 작업이 시작됩니다. 소스 폴더 내용이 열거되고 파일 크기에 따라 가장 큰 것부터 가장 작은 것까지 정렬됩니다. 파일 크기가 현재 대상보다 작거나 같은 경우에만 파일이 이동된 다음 업데이트됩니다. 이것탐욕스러운 검색더 이상 파일이 없거나 최소 임계값에 도달할 때까지(둘 중 먼저 도달하는 시점까지) 계속 진행합니다.

비고

  • 명령 해석기는 32비트를 사용합니다.부호 있는 정수산술 연산을 수행하기 위해 가장 높은 양수 값은 입니다 2^31 - 1 = 2147483647.

  • 대상 크기는 1KB에서 2TB 사이의 값(바이트)이 될 수 있습니다.

  • 숨김 또는 시스템 속성이 설정된 파일은 무시됩니다.

  • 원본 폴더에 이미 대상 폴더에 있는 파일이 하나 이상 포함되어 있는 경우 잠재적인 데이터 손실을 방지하기 위해 이동 작업을 건너뜁니다.

  • 성능상의 이유로 스크립트는 대상 폴더의 크기를 찾기 위해 모든 단계에서 파일을 열거하는 대신 캐시된 값을 사용했습니다. 동일한 이름을 공유하기 때문에 건너뛴 파일은 여전히 ​​총계에 합산되며 결과적으로 결과 크기가 왜곡될 수 있습니다.

  • 하위 폴더는 처리되지 않습니다. 필요한 경우 명령 /s에 매개변수를 추가합니다 dir. 소스 구조가 평면화되므로 대상으로 이동되지 않는 동일한 이름의 파일로 끝날 수도 있습니다.

추가 읽기

답변2

파워쉘과 함께.

하다 (한 폴더에서 다른 폴더로 파일 이동) 하는 동안 (폴더 크기가 바람직하지 않습니다.)

사용do while 루프를 사용하는 방법에 대한 데모필요에 맞게 위 스크립트를 사용하여 에코 스크립트를 변경하세요.

관련 정보