Последовательное архивирование файлов в папке.
Добрый день.
Будьте добры, помогите со скриптом.
Есть папка, в ней находится некоторое количество файлов, необходимо последовательно подряд брать заданное равное количество файлов, например по 6 и архивировать их в 7z архив. Название архивов 0,1,2,3 и тд. до окончания файлов. Архивы помещать в созданную в этой же папке новую папку.
Ручками приходится архивировать, хотелось бы немного автоматизации. Неравнодушным плюсик к карме. :help:
|
Код:
@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,
Цитата:
Цитата serrrr
некоторые перемешивает, не пойму по какому принципу он их пакует
|
а Вы на доводили до общего сведения Ваши принципы. Я определил порядок по дате последнего изменения - чем меньше номер архива, тем более старые там файлы. Не нравится – никто не ограничивает Вашей свободы изменить ключи команды dir :)
Цитата:
наверно нужно кодировку добавить
|
по умолчанию код cmd должен сохраняться в 866 кодировке, вам, наверное, надо после
Cls
>nul chcp 1251
если Ваш редактор не работает в 866 кодировке
|
Цитата:
Цитата megaloman
если Ваш редактор не работает в 866 кодировке »
|
В Notepad++ сохранил в 866 кодировке, стало работать с кириллическими путями. Спасибо.
|
Подскажите пожалуйста, как сделать, что бы команда dir с ключом /O:N сортировала так же как и системная сортировка? В системе отсортировано 1,2,3 и т.д., а dir сортирует в архивах 1,11,12,13. Как сделать, что бы было по порядку?
|
serrrr, Никак. При алфавитной сортировке 10000<9
|
Цитата:
Цитата serrrr
Как сделать, что бы было по порядку? »
|
Изучать powershell, в нем невозможное - возможно! :)
|
DJ Mogarych |
17-01-2023 09:27 3001125 |
Типа, CMD:
Код:
powershell -command "dir |sort {[int]($_.basename)}"
|
Цитата:
Цитата 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 |
Что именно нужно сортировать? Исходные файлы или что?
|
Цитата:
Цитата 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')}
|
Цитата:
Цитата DJ Mogarych
sort {[int]($_.basename -replace '\D')} »
|
Тут бы расширить условия сортировки, потому как если в файлах с разными названиям будет присутствовать цифровая часть, то отсортируются они не совсем верно по литеральной составляющей...
В общем, лучше бы так:
Код:
$files = dir $sourceFolder -file|sort{$_.name -replace '\d'},{[int]($_.name -replace '\D')}
|
Цитата:
Цитата serrrr
стали появляться такие ошибки. »
|
замените [int] на [int64] или [bigint]
|
Время: 12:49.
© OSzone.net 2001-