Показать полную графическую версию : Скрипт для распределения файлов по папкам кучками по n-ому размеру
DmitryAnatolich
04-05-2013, 13:04
Имеется папка с файлами. Требуется переместить файлы в подпапки (Dir1, Dir2, ... ), так чтобы каждая подпапка занимала не более, скажем 20 МБ.
Заранее всем спасибо.
1. Зачем?
2. Что делать, если какие-то файлы более «скажем 20 МБ»?
DmitryAnatolich
04-05-2013, 15:31
1. Надо :) Для уменьшения геморроя рук. Почтовый сервер нашей замечательной фирмы ограничивает вложения 25 метрами. Принимающая сторона файлообмены отвергает — только мыло. Посему и приходится при пересылке фото делить их на описанные кучки по «скажем, 20 МБ», паковать и отправлять.
Резать архив (многотомный, всмысле) тоже не вариант (по причине криворукости принимающей стороны).
2. Таких нет и не предвидятся. В качестве исключительной ситуации можно оставлять их на месте.
Foreigner
04-05-2013, 18:01
DmitryAnatolich, На PowerShell
push-location "C:\Folder"
$files = new-object system.collections.arraylist
$cnt = 1
gci | ? { !$_.psiscontainer -and $_.length -le 20Mb } | % { $files.add($_) }
new-item -t dir "dir$cnt"
while ($files) {
if (($size + $files[0].length) -le 20Mb) {
$size += $files[0].length
move-item $files[0] "dir$cnt"
$files.removerange(0,1)
} else {
$size = 0
$cnt += 1
new-item -t dir "dir$cnt"
}
}
pop-location
Где:
C:\Folder -- папка с вашими файлами
20Mb -- ограничение на размер создаваемых папок и размер файлов для перемещения
Попробуйте так:
Option Explicit
Dim strSourceFolder
Dim lngMaxSize
Dim objFSO
Dim objFile
Dim intFoldersCount
Dim strDestFolder
Dim lngSize
strSourceFolder = "E:\Песочница\0246\Source"
lngMaxSize = 20 * 2^20
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strSourceFolder) Then
lngSize = 0
intFoldersCount = 1
strDestFolder = objFSO.BuildPath(strSourceFolder, Right("0000" & CStr(intFoldersCount), Len("0000")))
objFSO.CreateFolder strDestFolder
For Each objFile In objFSO.GetFolder(strSourceFolder).Files
If objFile.Size < lngMaxSize Then
If lngSize + objFile.Size > lngMaxSize Then
lngSize = 0
intFoldersCount = intFoldersCount + 1
strDestFolder = objFSO.BuildPath(strSourceFolder, Right("0000" & CStr(intFoldersCount), Len("0000")))
objFSO.CreateFolder strDestFolder
End If
lngSize = lngSize + objFile.Size
objFile.Move strDestFolder & "\"
Else
WScript.Echo "Size of file [" & objFile.Name & "] is [" & objFile.Size & "] that more then MaxSize [" & lngMaxSize & "]"
End If
Next
Else
WScript.Echo "Source folder [" & strSourceFolder & "] not found"
End If
WScript.Quit 0
megaloman
04-05-2013, 20:37
bat-файл@Echo Off
Set Where=D:\Мои документы\Мои рисунки\20130504_Прогулка_по_реке
Set Prefix=Dir
Set Max=20000000
SetLocal EnableExtensions EnableDelayedExpansion
Set /A N=1000
Set /A Size=%Max%+1
For %%f In ("%Where%\*.*") Do (
Set /A NSize=!Size!+%%~zf
If !NSize! GTR %Max% (
Call :NewDir
Set /A NSize=%%~zf
)
Set /A Size=!NSize!
Move "%%f" !NDir! >nul
)
GoTo :Eof
:NewDir
Set /A N=%N%+1
Set NDir=%N:~-3%
Set NDir="%Where%\%Prefix%%NDir%\"
If Exist %NDir% GoTo :NewDir
Md %NDir%
Foreigner, megaloman — на все вкусы ;).
DmitryAnatolich
05-05-2013, 02:08
Просто великолепно! Всем спасибо! :clapping:
DmitryAnatolich
06-05-2013, 13:34
megaloman, кстати. Что за конструкции:
!NSize!
Смотрю мануал и не нахожу ничего похожего. Однако, работает :)
megaloman
06-05-2013, 15:20
DmitryAnatolich, Можно почитать здесь (http://www.rsdn.ru/article/winshell/batanyca.xml) или порыться в полезных ресурсах в первой теме ветки форума :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.