Компьютерный форум 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=355117)

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 папки, каждый новый бекап затирает самую старую

YuS_2 05-04-2024 12:21 3026226

Цитата:

Цитата Super_Kolobok
есть необходимость при появлении новой папки паковать ее »

моментально или после какого-то периода/события?

Super_Kolobok 05-04-2024 12:35 3026227

зачем моментально, бекап по расписанию идет, паковать потом тоже периодически по расписанию

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

DJ Mogarych 05-04-2024 18:01 3026232

Цитата:

Цитата Super_Kolobok
паковать только последнюю созданную папку »

Весь вопрос-то именно в этом - по какому критерию скрипт должен понять, какая папка последняя созданная и что это новая папка, а не уже существовавшая.

YuS_2 05-04-2024 20:48 3026236

Цитата:

Цитата 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


megaloman 08-04-2024 09:16 3026296

Цитата:

Цитата 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.

Время: 04:09.
© OSzone.net 2001-