Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Скрипт для распределения файлов по папкам кучками по n-ому размеру (http://forum.oszone.net/showthread.php?t=259933)

DmitryAnatolich 04-05-2013 13:04 2144261

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

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

Iska 04-05-2013 15:21 2144313

1. Зачем?
2. Что делать, если какие-то файлы более «скажем 20 МБ»?

DmitryAnatolich 04-05-2013 15:31 2144317

1. Надо :) Для уменьшения геморроя рук. Почтовый сервер нашей замечательной фирмы ограничивает вложения 25 метрами. Принимающая сторона файлообмены отвергает — только мыло. Посему и приходится при пересылке фото делить их на описанные кучки по «скажем, 20 МБ», паковать и отправлять.
Резать архив (многотомный, всмысле) тоже не вариант (по причине криворукости принимающей стороны).
2. Таких нет и не предвидятся. В качестве исключительной ситуации можно оставлять их на месте.

Foreigner 04-05-2013 18:01 2144382

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 2144387

читать дальше »
Попробуйте так:
Код:

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 2144478

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 2144490

Foreigner, megaloman — на все вкусы ;).

DmitryAnatolich 05-05-2013 02:08 2144589

Просто великолепно! Всем спасибо! :clapping:

DmitryAnatolich 06-05-2013 13:34 2145289

megaloman, кстати. Что за конструкции:
Код:

!NSize!
Смотрю мануал и не нахожу ничего похожего. Однако, работает :)

megaloman 06-05-2013 15:20 2145347

DmitryAnatolich, Можно почитать здесь или порыться в полезных ресурсах в первой теме ветки форума :)


Время: 11:41.

Время: 11:41.
© OSzone.net 2001-