根据总大小批量移动文件

Batch to move files based on total size

我在一个特定文件夹中有 900k 个文件,我需要根据 100 mb 的总大小每天移动到另一个文件夹。我试过下面的代码,但它移动了 100 个文件,而不是 100 mbs 的总量

@echo on

set Source=C:\Users\%Username%\Desktop\Dropbox\Pre
set Target=C:\Users\%Username%\Desktop\Dropbox\Pos

set MaxLimit=10

for /f "tokens=1* delims=[]" %%G in ('dir /A-D /B "%Source%\*.*" ^| find /v /n ""') do (
move /y "%Source%\%%~nxH" "%Target%"
if %%G==%MaxLimit% exit /b 0
)

pause

我需要批处理来移动文件大小总和小于或等于 10 kbs 的选择。如果我手动选择组成 100 mbs 的 N 个文件,基本上是做同样的事情。 我认为它不起作用,因为它只检查单个文件的大小。

基本问题是您必须跟踪复制了多少数据并检查它是否超过了 MaxLimit。这在 PowerShell 中并不困难。此脚本会将最多 $MaxLimit 个字节复制到 $TargetDir。此脚本需要 PowerShell Core 6+。 https://github.com/PowerShell/PowerShell 当前的稳定版本是 7.1.5。这可以通过更改 Join-Path 语句来与旧的 Windows PowerShell 5.1 一起使用。

将这两 (2) 个文件放在同一目录中。当您确信正确的文件将被复制到正确的目录时,从 Move-Item 命令中删除 -WhatIf

===移动-PictureBatch.bat

@pwsh -NoLogo -NoProfile -File "%~dp0Move-PictureBatch.ps1"

=== Move-PictureBatch.ps1

#Requires -Version 6
$MaxLimit = 100MB
$SourceDir = Join-Path -Path $Env:USERPROFILE -ChildPath 'Desktop' -AdditionalChildPath 'Pre'
$TargetDir = Join-Path -Path $Env:USERPROFILE -ChildPath 'Desktop' -AdditionalChildPath 'Pos'
$CurrentSize = 0

Get-ChildItem -File -Path $SourceDir |
    ForEach-Object {
        if (($CurrentSize + $_.Length) -lt $MaxLimit) {
            Move-Item -Path $_.FullName -Destination $TargetDir -WhatIf
            $CurrentSize += $_.Length
        } else {
            break
        }
    }