Super_Kolobok |
05-04-2024 02:06 3026220 |
Паковать папки и переносить последний архив в другую папку
Приветствую
Есть папка 1 с папками бекапов А, Б, С, ...., есть необходимость при появлении новой папки паковать ее в отдельный архив с удалением папки, и копировать архив с последней датой в другую папку 2, предварительно очистив ее.
Спасибо
|
DJ Mogarych |
05-04-2024 09:22 3026223 |
А папки бекапов А, Б, С должны оставаться там всегда?
|
Super_Kolobok |
05-04-2024 10:27 3026224 |
Сейчас там остается 3 папки, каждый новый бекап затирает самую старую
|
Цитата:
Цитата Super_Kolobok
есть необходимость при появлении новой папки паковать ее »
|
моментально или после какого-то периода/события?
|
Super_Kolobok |
05-04-2024 12:35 3026227 |
зачем моментально, бекап по расписанию идет, паковать потом тоже периодически по расписанию
можно совсем упростить - Нужно паковать только последнюю созданную папку
|
DJ Mogarych |
05-04-2024 18:01 3026232 |
Цитата:
Цитата Super_Kolobok
паковать только последнюю созданную папку »
|
Весь вопрос-то именно в этом - по какому критерию скрипт должен понять, какая папка последняя созданная и что это новая папка, а не уже существовавшая.
|
Цитата:
Цитата DJ Mogarych
по какому критерию скрипт должен понять, какая папка последняя созданная и что это новая папка, а не уже существовавшая. »
|
Так ведь есть критерий: по времени. А была она там или нет - неважно... если я правильно понял.
Цитата:
Цитата Super_Kolobok
можно совсем упростить - Нужно паковать только последнюю созданную папку »
|
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
|
Цитата:
Цитата Super_Kolobok
Есть папка 1 с папками бекапов А, Б, С, »
|
Цитата:
Цитата Super_Kolobok
Сейчас там остается 3 папки, каждый новый бекап затирает самую старую »
|
Цитата:
Цитата Super_Kolobok
при появлении новой папки паковать ее в отдельный архив с удалением папки »
|
Не надо удалять папку, это делает средство создания бэкапа. В противном случае, при возможном сбое Вы будете архивировать оставшиеся более старые папки, а актуальный бэкап будет утерян.
Вот вариант:
- если в папке 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
|
Время: 04:09.
© OSzone.net 2001-