Войти

Показать полную графическую версию : Скрипт для распределения файлов по папкам кучками по n-ому размеру


DmitryAnatolich
04-05-2013, 13:04
Имеется папка с файлами. Требуется переместить файлы в подпапки (Dir1, Dir2, ... ), так чтобы каждая подпапка занимала не более, скажем 20 МБ.

Заранее всем спасибо.

Iska
04-05-2013, 15:21
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 -- ограничение на размер создаваемых папок и размер файлов для перемещения

Iska
04-05-2013, 18:05
Попробуйте так:
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%

Iska
04-05-2013, 21:01
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