根据总大小批量移动文件



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

@echo on
set Source=C:Users%Username%DesktopDropboxPre
set Target=C:Users%Username%DesktopDropboxPos
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 kb。如果我手动选择N个文件,大小为100mb,基本上也是一样的。我相信它没有工作,因为它只检查单个文件的大小。

基本问题是您必须跟踪已复制的数据量,并检查是否超过了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

= = = Move-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
}
}

最新更新