批处理脚本

批处理脚本

在 Windows 中,如何将文件移动到文件夹直到其达到一定大小?

答案1

批处理脚本

下面是一个可以完成此操作的脚本。它有四个参数,最后一个是可选的:源文件夹;目标文件夹;目标大小(以字节为单位);应匹配的文件扩展名。除大小之外的所有参数都需要加引号。

@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

  • 目标大小可以是 1 KB 到 2 TB 之间的任意值(以字节为单位)。

  • 具有隐藏或系统属性集的文件将被忽略。

  • 如果源文件夹包含一个或多个已存在于目标文件夹中的文件,则将跳过移动操作以避免潜在的数据丢失。

  • 出于性能原因,脚本使用缓存值而不是在每一步都枚举文件来查找目标文件夹的大小。由于名称相同而被跳过的文件仍将计入总数,因此最终的大小可能会出现偏差。

  • 子文件夹不会被处理。如果需要,请将参数添加/sdir命令中。由于源结构被扁平化,因此最终可能会出现无法移动到目标的同名文件。

进一步阅读

答案2

使用 Powershell。

做 (将文件从一个文件夹移动到另一个文件夹) 尽管 (文件夹大小不理想

使用这个演示介绍了如何使用 do while 循环并使用上述脚本更改 echo 脚本以满足您的需要。

相关内容