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

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

serrrr 12-01-2023 20:44 3000822

Последовательное архивирование файлов в папке.
 
Добрый день.
Будьте добры, помогите со скриптом.
Есть папка, в ней находится некоторое количество файлов, необходимо последовательно подряд брать заданное равное количество файлов, например по 6 и архивировать их в 7z архив. Название архивов 0,1,2,3 и тд. до окончания файлов. Архивы помещать в созданную в этой же папке новую папку.
Ручками приходится архивировать, хотелось бы немного автоматизации. Неравнодушным плюсик к карме. :help:

megaloman 13-01-2023 10:11 3000856

Код:

@Echo Off
cls
        Set "BoxIn=Z:\Есть папка, в ней находится некоторое количество файлов"
        Set /A M=6
        Set "BoxOut=Arc %Date%"

    Set Arc="C:\Program Files\7-Zip\7z.exe" a -sdel

        Pushd "%BoxIn%"||(Echo Folder "%BoxIn%" not found &Pause &Exit /B)
                2>nul Md "%BoxOut%"

                Set /A Narc=0
                Set /A i=0
                Set "Str="
                FOR /F "usebackq delims==" %%f In (`2^>nul Dir /B /A:-D /O:D /T:W`) DO (
                        Call Set /A i+=1
                        Call :Out %%i%% "%%f"
                )
                If Not "%Str%"=="" %Arc% "%BoxOut%\%Narc%.7Z" %Str%
        Popd
pause
Exit /B 0

:Out
        Set /A MM=%1%%%M%
        Set "Str=%Str% %2"
        If Not %MM% EQU 0 Exit /B

        rem Echo %1 %MM% %2 %Str%
        %Arc% "%BoxOut%\%Narc%.7Z" %Str%
        Set "Str="
        Set /A Narc+=1
Exit /B 0

Если после архивации не надо удалять исходные файлы, уберите ключ -sdel

DJ Mogarych 13-01-2023 10:58 3000858

Powershell
Код:

$archiver = "C:\Program Files\7-Zip\7z.exe"
$sourceFolder = "D:\temp"
$backupFolder = $sourceFolder
$chunkSize = 5

$files = dir $sourceFolder |? psiscontainer -eq $false
for ($c,$s = 0,0; $s -lt $files.Count; $s += $chunkSize) {
    & $archiver a "$backupFolder\$c.7z" ($files |select -Skip $s -First $chunkSize).fullname
    $c++
}


serrrr 13-01-2023 17:56 3000894

Друзья, Вы лучшие! Оба варианта сработали. Единственное у батника не срабатывает на кириллический путь, наверно нужно кодировку добавить. Срабатывает только на латиницу. Огромное Вам спасибо, частичка рутины моей теперь будет автоматизирована.

serrrr 13-01-2023 20:46 3000912

На пробных папках было все нормально, а как натравил на большую папку, вот тут и засада. Архивирует в архивы заданное количество файлов, но проблема, что архивирует их не все строго по порядку, а некоторые перемешивает, не пойму по какому принципу он их пакует.

megaloman 13-01-2023 21:56 3000917

serrrr,
Цитата:

Цитата serrrr
некоторые перемешивает, не пойму по какому принципу он их пакует

а Вы на доводили до общего сведения Ваши принципы. Я определил порядок по дате последнего изменения - чем меньше номер архива, тем более старые там файлы. Не нравится – никто не ограничивает Вашей свободы изменить ключи команды dir :)
Цитата:

наверно нужно кодировку добавить
по умолчанию код cmd должен сохраняться в 866 кодировке, вам, наверное, надо после
Cls
>nul chcp 1251
если Ваш редактор не работает в 866 кодировке

serrrr 13-01-2023 22:11 3000919

Цитата:

Цитата megaloman
если Ваш редактор не работает в 866 кодировке »

В Notepad++ сохранил в 866 кодировке, стало работать с кириллическими путями. Спасибо.

serrrr 16-01-2023 22:41 3001098

Подскажите пожалуйста, как сделать, что бы команда dir с ключом /O:N сортировала так же как и системная сортировка? В системе отсортировано 1,2,3 и т.д., а dir сортирует в архивах 1,11,12,13. Как сделать, что бы было по порядку?

megaloman 16-01-2023 23:38 3001104

serrrr, Никак. При алфавитной сортировке 10000<9

YuS_2 17-01-2023 08:40 3001119

Цитата:

Цитата serrrr
Как сделать, что бы было по порядку? »

Изучать powershell, в нем невозможное - возможно! :)

DJ Mogarych 17-01-2023 09:27 3001125

Типа, CMD:
Код:

powershell -command "dir |sort {[int]($_.basename)}"

serrrr 17-01-2023 11:16 3001132

Цитата:

Цитата DJ Mogarych
powershell -command "dir |sort {[int]($_.basename)}" »

Подскажите пожалуйста, куда нужно вставить этот код в этот скрипт, что бы он сортировал правильно?
Код:

$archiver = "C:\Program Files\7-Zip\7z.exe"
$sourceFolder = "D:\temp"
$backupFolder = $sourceFolder
$chunkSize = 5

$files = dir $sourceFolder |? psiscontainer -eq $false
for ($c,$s = 0,0; $s -lt $files.Count; $s += $chunkSize) {
    & $archiver a "$backupFolder\$c.7z" ($files |select -Skip $s -First $chunkSize).fullname
    $c++
}


DJ Mogarych 17-01-2023 11:42 3001134

Что именно нужно сортировать? Исходные файлы или что?

serrrr 17-01-2023 15:10 3001139

Цитата:

Цитата DJ Mogarych
Что именно нужно сортировать? Исходные файлы или что? »

Нужно что бы файлы в архивы запаковывались в той же последовательности, как когда их сортирует виндовс по названию. Т. е. в первом архиве должны быть файлы с номером фото1, фото2,фото3,фото4 и т.д. А сейчас там например фото1, фото11, фото12, фото13. Нужна правильная сортировка по наименованию, когда в названии присутствуют числа, при запаковке в архивы.

DJ Mogarych 17-01-2023 16:33 3001143

Исходные файлы, понятно.
Код:

$files = dir $sourceFolder |? psiscontainer -eq $false |sort {[int]($_.basename -replace '\D')}

YuS_2 17-01-2023 17:44 3001152

Цитата:

Цитата DJ Mogarych
sort {[int]($_.basename -replace '\D')} »

Тут бы расширить условия сортировки, потому как если в файлах с разными названиям будет присутствовать цифровая часть, то отсортируются они не совсем верно по литеральной составляющей...
В общем, лучше бы так:
Код:

$files = dir $sourceFolder -file|sort{$_.name -replace '\d'},{[int]($_.name -replace '\D')}

serrrr 17-01-2023 18:26 3001159

Большое спасибо!

serrrr 18-01-2023 21:58 3001228

Цитата:

Цитата YuS_2
$files = dir $sourceFolder -file|sort{$_.name -replace '\d'},{[int]($_.name -replace '\D')} »

изменил на этот код, но стали появляться такие ошибки. https://sun9-north.userapi.com/sun9-...=95&type=album

YuS_2 18-01-2023 22:16 3001229

Цитата:

Цитата serrrr
стали появляться такие ошибки. »

замените [int] на [int64] или [bigint]


Время: 12:49.

Время: 12:49.
© OSzone.net 2001-