Показать полную графическую версию : Последовательное архивирование файлов в папке.
Добрый день.
Будьте добры, помогите со скриптом.
Есть папка, в ней находится некоторое количество файлов, необходимо последовательно подряд брать заданное равное количество файлов, например по 6 и архивировать их в 7z архив. Название архивов 0,1,2,3 и тд. до окончания файлов. Архивы помещать в созданную в этой же папке новую папку.
Ручками приходится архивировать, хотелось бы немного автоматизации. Неравнодушным плюсик к карме. :help:
megaloman
13-01-2023, 10:11
@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
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++
}
Друзья, Вы лучшие! Оба варианта сработали. Единственное у батника не срабатывает на кириллический путь, наверно нужно кодировку добавить. Срабатывает только на латиницу. Огромное Вам спасибо, частичка рутины моей теперь будет автоматизирована.
На пробных папках было все нормально, а как натравил на большую папку, вот тут и засада. Архивирует в архивы заданное количество файлов, но проблема, что архивирует их не все строго по порядку, а некоторые перемешивает, не пойму по какому принципу он их пакует.
megaloman
13-01-2023, 21:56
serrrr, некоторые перемешивает, не пойму по какому принципу он их пакуета Вы на доводили до общего сведения Ваши принципы. Я определил порядок по дате последнего изменения - чем меньше номер архива, тем более старые там файлы. Не нравится – никто не ограничивает Вашей свободы изменить ключи команды dir :)
наверно нужно кодировку добавитьпо умолчанию код cmd должен сохраняться в 866 кодировке, вам, наверное, надо после
Cls
>nul chcp 1251
если Ваш редактор не работает в 866 кодировке
если Ваш редактор не работает в 866 кодировке »
В Notepad++ сохранил в 866 кодировке, стало работать с кириллическими путями. Спасибо.
Подскажите пожалуйста, как сделать, что бы команда dir с ключом /O:N сортировала так же как и системная сортировка? В системе отсортировано 1,2,3 и т.д., а dir сортирует в архивах 1,11,12,13. Как сделать, что бы было по порядку?
megaloman
16-01-2023, 23:38
serrrr, Никак. При алфавитной сортировке 10000<9
Как сделать, что бы было по порядку? »
Изучать powershell, в нем невозможное - возможно! :)
DJ Mogarych
17-01-2023, 09:27
Типа, CMD:
powershell -command "dir |sort {[int]($_.basename)}"
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
Что именно нужно сортировать? Исходные файлы или что?
Что именно нужно сортировать? Исходные файлы или что? »
Нужно что бы файлы в архивы запаковывались в той же последовательности, как когда их сортирует виндовс по названию. Т. е. в первом архиве должны быть файлы с номером фото1, фото2,фото3,фото4 и т.д. А сейчас там например фото1, фото11, фото12, фото13. Нужна правильная сортировка по наименованию, когда в названии присутствуют числа, при запаковке в архивы.
DJ Mogarych
17-01-2023, 16:33
Исходные файлы, понятно.
$files = dir $sourceFolder |? psiscontainer -eq $false |sort {[int]($_.basename -replace '\D')}
sort {[int]($_.basename -replace '\D')} »
Тут бы расширить условия сортировки, потому как если в файлах с разными названиям будет присутствовать цифровая часть, то отсортируются они не совсем верно по литеральной составляющей...
В общем, лучше бы так:
$files = dir $sourceFolder -file|sort{$_.name -replace '\d'},{[int]($_.name -replace '\D')}
$files = dir $sourceFolder -file|sort{$_.name -replace '\d'},{[int]($_.name -replace '\D')} »
изменил на этот код, но стали появляться такие ошибки. https://sun9-north.userapi.com/sun9-82/s/v1/ig2/NBFnYB5iGCU3Vb2iht9thYQBh7A-iQFkrmZGDCJbF9TIZvSZe_uyz1bfUBM-0Ec-AC9nVS4nb79b4CAMXD2T1Rum.jpg?size=899x743&quality=95&type=album
стали появляться такие ошибки. »
замените [int] на [int64] или [bigint]
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.