PDA

Показать полную графическую версию : Паковать папки и переносить последний архив в другую папку


Super_Kolobok
05-04-2024, 02:06
Приветствую
Есть папка 1 с папками бекапов А, Б, С, ...., есть необходимость при появлении новой папки паковать ее в отдельный архив с удалением папки, и копировать архив с последней датой в другую папку 2, предварительно очистив ее.

Спасибо

DJ Mogarych
05-04-2024, 09:22
А папки бекапов А, Б, С должны оставаться там всегда?

Super_Kolobok
05-04-2024, 10:27
Сейчас там остается 3 папки, каждый новый бекап затирает самую старую

YuS_2
05-04-2024, 12:21
есть необходимость при появлении новой папки паковать ее »
моментально или после какого-то периода/события?

Super_Kolobok
05-04-2024, 12:35
зачем моментально, бекап по расписанию идет, паковать потом тоже периодически по расписанию

можно совсем упростить - Нужно паковать только последнюю созданную папку

DJ Mogarych
05-04-2024, 18:01
паковать только последнюю созданную папку »
Весь вопрос-то именно в этом - по какому критерию скрипт должен понять, какая папка последняя созданная и что это новая папка, а не уже существовавшая.

YuS_2
05-04-2024, 20:48
по какому критерию скрипт должен понять, какая папка последняя созданная и что это новая папка, а не уже существовавшая. »
Так ведь есть критерий: по времени. А была она там или нет - неважно... если я правильно понял.
можно совсем упростить - Нужно паковать только последнюю созданную папку »
powershell
function Compress-New {
param(
[Parameter(Mandatory,ValueFromPipeline)]
$source,
$destination,
$swt1,
$swt2,
$arch
)
process{
$aout = $destination + '\' + $_.name + ('_{0:yyyy-MM-dd_HH-mm-ss}' -f (get-date))+'.zip'
$compress = @{
Path = $source
#CompressionLevel = "Fastest"
DestinationPath = $aout
}
if (!$swt1){
compress-archive @compress
if ($swt2) {del $source.fullname -force -rec}
} else {
if ($swt2) {&$arch a $aout $source -sdel} else {&$arch a $aout $source}
}
}
}

# каталог с архивами, лучше указать абсолютный путь:
$root = '.\1'
# целевой каталог для хранения новых архивов, лучше указать абсолютный путь:
$destination = '.\2'

$par = @{
Destination = (gi $destination).fullname
# путь к файлу внешнего архиватора 7zip
Arch = "d:\Program Files\7-Zip\7z.exe"
# ключ для выбора вида компрессии: 0 - встроенная упаковка, 1 - внешний архиватор 7zip
Swt1 = 1
# ключ для выбора удаления исходных файлов: 0 - не удалять, 1 - удалять
Swt2 = 1
}

if (dir $par.destination){
del $par.destination -rec -force
$null = md $par.destination
}

dir $root -dir|sort lastwritetime -des|select -first 1|compress-new @par

megaloman
08-04-2024, 09:16
Есть папка 1 с папками бекапов А, Б, С, »Сейчас там остается 3 папки, каждый новый бекап затирает самую старую » при появлении новой папки паковать ее в отдельный архив с удалением папки »Не надо удалять папку, это делает средство создания бэкапа. В противном случае, при возможном сбое Вы будете архивировать оставшиеся более старые папки, а актуальный бэкап будет утерян.
Вот вариант:
- если в папке 2 уже есть архив последней папки (имя "дата время.7Z"), то ничего не делаем
- в противном случае делаем архив самой свежей папки с именем "дата время.7Z"
-в случае благополучного завершения архивации очищаем 2 папку от архивов и переносим туда новый архив.@Echo Off &Cls &>nul Chcp 1251
Set "BoxIn=Z:\Box_In"
Set "BoxOut=\\192.168.100.23\Test2"
Set Arc="C:\Program Files\7-Zip\7z.exe" a -r

Pushd "%BoxIn%" || (Echo Folder "%BoxIn%\" not found &Pause &Exit /B 2)
For /F "usebackq delims=" %%i In (`2^>nul Dir /B /A:D /T:W /O:D`) Do (Set "DirName=%%i" &Set "DirDate=%%~ti")
Set "DirDate=%DirDate::=.%"
Set "DirDate=%DirDate:/=.%"
Set "DirDate=%DirDate:\=.%"
If Exist "%BoxOut%\%DirDate%.7Z" Exit /B 1
%Arc% "%DirDate%.7Z" "%DirName%" &&(Del "%BoxOut%\*7Z" &Move "%DirDate%.7Z" "%BoxOut%\")
Popd
Exit /B




© OSzone.net 2001-2012