Форум программистов, компьютерный форум, киберфорум
Наши страницы

Batch (CMD/BAT)

Войти
Регистрация
Восстановить пароль
 
NeoMatrix
Модератор
Эксперт NIX
3707 / 985 / 86
Регистрация: 24.05.2011
Сообщений: 9,850
Записей в блоге: 2
#1

Скрипт автоархивации каталога - CMD/BAT

13.12.2017, 14:38. Просмотров 164. Ответов 13
Метки нет (Все метки)

Всем привет!

Мне нужен скрипт, который я думаю воткнуть в планировщик Виндовс, который будет регулярно архивировать прописанные в теле скрипта директории и складывать их в другую, также прописанную в теле скрипта, директорию, Но хотелось бы, чтобы оно писало всего две версии архива: последнюю и предпоследнюю, чтобы не захламляло место на HDD устаревшими архивами.
В смысле: в путях "D:\%Path%\DataBase\DB1", "D:\%Path%\DataBase\DB2", "D:\%Path%\DataBase\DB3" и т.д. лежат текущие базы данных
Я думаю заархивировать "D:\%Path%\DataBase" в файл "H:\Arhives\New\DataBases1.7z" , но при этом, то, что лежит в этом пути переложить в "H:\Arhives\Old\DataBases1.7z" , а "H:\Arhives\Old\DataBases1.7z" - удалить
тем самым, у меня должно иметься в наличии две версии архива - последняя в New и предпоследняя в Old.
Аналогично по этому же алгоритму делать архив и с базами в "E:\%Path%\DataBase\DB1", "E:\%Path%\DataBase\DB2" и т.д. в "H:\Arhives\New\DataBases2.7z" и "H:\Arhives\Old\DataBases2.7z"

Собственно, у меня загвоздка с кодингом - ручками я это делаю, но в скрипт оформить у меня не получается.
До сегодняшнего дня всё это делалось руками китайским HaoZip'ом и в другие пути. Далее думаю всё это автоматизировать с использованием 7Zip (можно и с RAR). Так что, особого значения, на данный момент, который из архиваторов использовать, для меня пока нет.

Сейчас буду разбираться с ключами и опциями этих архиваторов, если у кого-либо есть какие-либо дельные советы - милости прошу.
Если вы напишете готовое решение с этими архиваторами и путями - буду особо благодарен.
За любое содействие - уже спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2017, 14:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Скрипт автоархивации каталога (CMD/BAT):

Создание каталога, копирование файлов, архивирование содержимого каталога, запись результата работы в файл - CMD/BAT
Написать командный файл, выполняющий следующие действия: создать каталог с названием dir<дата>, где <дата> - дата, которая была 35000...

Рекурсивный поиск и удаление каталога. Пробелы в имени каталога - CMD/BAT
Со вторым днем зимы всех. Есть bat: @echo off rem unsvn.bat setlocal rem rdir=название_удаляемых_каталогов set rdir=Startup ...

Объединить скрипт удаления переводов строки и скрипт вставки перевода по специальному символу - CMD/BAT
Здравствуйте, решаю задачу обработки текстового файла, необходимо сперва удалить все переносы строк, а потом выставить их заново по...

Скрипт, формирующий для вывода определённого сообщения через заданный промежуток времени другой скрипт - CMD/BAT
Приветствую сообщество CyberForum. Подскажите как реализовать такую задачу. Задача: При запуске скрипта должен формироваться другой...

Обновление ОС из каталога - CMD/BAT
В общем в сетке есть несколько машинок на разных ос (хр,7,8) и есть общий каталог update/windows/.. нужно чтобы при запуске скрипта на...

Создание каталога по расширению - CMD/BAT
Как в cmd создать каталог по расширению? Т.е. Если у меня НАПРИМЕР 3 типа: *.doc, *.txt, *.ppt Нужно чтоб имя каталога...

13
Dragokas
Эксперт WindowsАвтор FAQ
16614 / 6999 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
13.12.2017, 15:01 #2
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@echo off
SetLocal EnableExtensions
 
:: каталог с предыдущей версией архива
set NewArcPath=H:\Arhives\New
 
:: каталог с новой версией архива
set OldArcPath=H:\Arhives\Old
 
:: путь к 7zip архиватору
set arc7z=.\tools\7zip\7za.exe
 
if not exist "%NewArcPath%" md "%NewArcPath%"
if not exist "%OldArcPath%" md "%OldArcPath%"
 
:: Список путей для архивации
For %%a in (
"g:\1\DB1"
"g:\1\DB2"
) do (
  echo.
  if exist "%NewArcPath%\%%~nxa.7z" (
    echo Moving %%~nxa.7z to "%OldArcPath%" ...
    move /y "%NewArcPath%\%%~nxa.7z" "%OldArcPath%\" && (echo Success.) || (echo !!! FAILED !!! & pause>NUL)
  )
  echo.
  echo Zipping %%~nxa.7z
  >NUL "%arc7z%" a -mx9 -y -o"%NewArcPath%" "%NewArcPath%\%%~nxa.7z" "%%a" && (echo Success.) || (echo !!! FAILED !!! & pause>NUL)
)
echo.
echo Finished.
pause
1
NeoMatrix
Модератор
Эксперт NIX
3707 / 985 / 86
Регистрация: 24.05.2011
Сообщений: 9,850
Записей в блоге: 2
13.12.2017, 15:24  [ТС] #3
Спасибо, только покажи, где мне прописать пути к текущим рабочим директориям с базами на D:\ и на E:\ , а то я не совсем понял.
Если я заменю
Windows Batch file
1
2
"g:\1\DB1"
"g:\1\DB2"
на абсолютные пути
Windows Batch file
1
2
"D:\%Path%\DataBase\"
"E:\%Path%\DataBase\"
Оно работать будет?

Вместо %Path% я подставлю реальные пути к каталогам.
В данный момент я не помню реальные пути - они на другой удалённой машине, к которой удалённого доступа у меня нет.
0
YuS_2
Любознательный
704 / 497 / 163
Регистрация: 10.03.2016
Сообщений: 1,169
13.12.2017, 15:28 #4
Цитата Сообщение от NeoMatrix Посмотреть сообщение
Оно работать будет?
работать оно будет, но вот системную переменную %path%, лучше в таких действиях не использовать...
1
Dragokas
Эксперт WindowsАвтор FAQ
16614 / 6999 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
13.12.2017, 15:38 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
NeoMatrix, не будет. Сейчас переделаю тебе чуть иначе, чтоб имена архивов можно было указать явно.

Добавлено через 7 минут
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
:: каталог с предыдущей версией архива
set NewArcPath=H:\Arhives\New
 
:: каталог с новой версией архива
set OldArcPath=H:\Arhives\Old
 
:: путь к 7zip архиватору
set arc7z=.\tools\7zip\7za.exe
 
if not exist "%NewArcPath%" md "%NewArcPath%"
if not exist "%OldArcPath%" md "%OldArcPath%"
 
:: Список путей для архивации и соответствующего им имени архива
 
:: Кол-во путей
set PathCnt=2
 
set path[1]=g:\1\DB1
set arc[1]=DataBases1
 
set path[2]=g:\1\DB2
set arc[2]=DataBases2
 
For /L %%C in (1,1,%PathCnt%) do (
  echo.
  if exist "%NewArcPath%\!arc[%%C]!.7z" (
    echo Moving !arc[%%C]!.7z to "%OldArcPath%" ...
    move /y "%NewArcPath%\!arc[%%C]!.7z" "%OldArcPath%\" && (echo Success.) || (echo !!! FAILED !!! & pause>NUL)
  )
  echo.
  echo Zipping !arc[%%C]!.7z
  >NUL "%arc7z%" a -mx9 -y -o"%NewArcPath%" "%NewArcPath%\!arc[%%C]!.7z" "!path[%%C]!" && (echo Success.) || (echo !!! FAILED !!! & pause>NUL)
)
echo.
echo Finished.
pause
Восклицательные знаки в путях указывать будет нельзя.
1
NeoMatrix
Модератор
Эксперт NIX
3707 / 985 / 86
Регистрация: 24.05.2011
Сообщений: 9,850
Записей в блоге: 2
13.12.2017, 19:20  [ТС] #6
Цитата Сообщение от YuS_2 Посмотреть сообщение
системную переменную %path%, лучше в таких действиях не использовать
Как бы вам объяснить?
Джентльмены, вы меня извиняйте - я вообще не особо хорошо разбираюсь в этом деле. И к тому же, исходя их этого, не очень хорошо объясняю, что мне нужно, видимо...
Системные переменные я здесь не использую совсем. В случае с %path% здесь имеется ввиду путь к каталогу в котором лежат эти самые базы, но он нигде в системе в переменных окружения не должен фигурировать (для системы это просто папка с файлами) - не прописан он в переменных окружения. То бишь, мне как-то надо прописать его прямо в скрипте в явном абсолютном виде:
Windows Batch file
1
2
3
4
5
6
7
8
D:\Базы Данных\Базы 1С\ООО Вектор\Радуга\Зарплата\
D:\Базы Данных\Базы 1С\ООО Вектор\Радуга\Склад\
D:\Базы Данных\Базы 1С\ООО Вектор\Радуга\Розница\
D:\Базы Данных\Базы 1С\ООО Вектор\Колибри\Склад\
D:\Базы Данных\Базы 1С\ООО ВекторПлюс\Колибри\Зарплата\
E:\БД\Старые\1С\ООО Вектор\Радуга\Зарплата\
E:\БД\Старые\1С\ООО Вектор\Радуга\Склад\
E:\БД\Старые\1С\ООО Вектор\Радуга\Розница\
и так далее. В путях - полнейший бардак.
Поэтому я и прошу показать мне где и как их прописать в абсолютном виде.

Ещё раз прошу прощения - это целиком моя вина - я пытался не грузить вас излишними подробностями, Надеялся, что нужные значения подставлю сам вручную, просто скопипастив их в скрипт.
Но я реально не понял, как это сделать с данным Dragokas скриптом.

В общем и целом, я понимаю, что значит системная %path%, что её в данном случае использовать совершенно не нужно, да и, кроме того - небезопасно для стабильности виндовс.Также, я догадываюсь, что твой, дружище Dragokas, скрипт будет работать пока ктулху не фтагн, но я, откровенно, его не понимаю. Точнее - не весь. А именно - откуда скрипт берёт пути к исходным папкам с базами.

А общий план действий у меня был такой:
1 В пятницу вечером бухгалтер оставляет машинку работать, а не выключает.
2 В 17:05 планировщик запускает скрипт, который выполняет архивацию.
3 После завершения архивации в какой-нибудь файлик пишется результат (когда выполнялась архивация, результат - успешно или нет)
4 После этого машинка выключается.

Цитата Сообщение от Dragokas Посмотреть сообщение
Восклицательные знаки в путях указывать будет нельзя.
В путях есть кириллица в обоих регистрах, латиница в обоих регистрах, пробелы. Возможно, дефисы.
Других символов нет. Если это сложно - я могу переписать пути руками одной латиницей в нижнем регистре без пробелов - не проблема.
0
Dragokas
Эксперт WindowsАвтор FAQ
16614 / 6999 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
13.12.2017, 19:32 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от NeoMatrix Посмотреть сообщение
В путях есть кириллица в обоих регистрах, латиница в обоих регистрах, пробелы. Возможно, дефисы.
Это всё допускается. Только файл нужно сохранять в кодировке oem-866. См.: Русский текст в консоли

Пути прописываются здесь:
Цитата Сообщение от Dragokas Посмотреть сообщение
set path[1]=g:\1\DB1
set arc[1]=DataBases1
set path[2]=g:\1\DB2
set arc[2]=DataBases2
path - путь
arc - имя архива, куда будет упаковано.

Добавлено через 38 секунд
если путей более двух, меняешь эту цифру:
Цитата Сообщение от Dragokas Посмотреть сообщение
:: Кол-во путей
set PathCnt=2
1
NeoMatrix
Модератор
Эксперт NIX
3707 / 985 / 86
Регистрация: 24.05.2011
Сообщений: 9,850
Записей в блоге: 2
13.12.2017, 19:46  [ТС] #8
То есть, я смело могу заменить g:\1\DB1 на D:\Базы Данных\Базы 1С\ООО Вектор\Радуга\Розница\?
Но только останется посчитать количество путей для сохранения?

Просто великолепно!
Спасибо сердечное!
0
Dragokas
Эксперт WindowsАвтор FAQ
16614 / 6999 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
13.12.2017, 19:52 #9
Da
1
NeoMatrix
Модератор
Эксперт NIX
3707 / 985 / 86
Регистрация: 24.05.2011
Сообщений: 9,850
Записей в блоге: 2
13.12.2017, 20:29  [ТС] #10
Цитата Сообщение от Dragokas Посмотреть сообщение
Windows Batch file
1
2
3
4
5
:: каталог с предыдущей версией архива 
set NewArcPath=H:\Arhives\New 
 
:: каталог с новой версией архива 
set OldArcPath=H:\Arhives\Old
А тут путаницы нет, случаем?
0
Dragokas
Эксперт WindowsАвтор FAQ
16614 / 6999 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
13.12.2017, 20:40 #11
Ну да, комментарии местами поменяй.
1
SNK_2015
1 / 1 / 0
Регистрация: 13.12.2015
Сообщений: 1
13.12.2017, 21:32 #12
Надо ещё отсеять .cdx индексные файлы 1с7.7, т.к. в архиве они тоже занимают место, а совсем не нужны
1
YuS_2
Любознательный
704 / 497 / 163
Регистрация: 10.03.2016
Сообщений: 1,169
14.12.2017, 00:55 #13
В качестве альтернативы (нет ограничений в используемых символах, не нужен дополнительный архиватор и т.п.):

run.bat
Windows Batch file
1
2
3
4
5
@echo off
echo Выполняем...
powershell -executionpolicy bypass .\script.ps1
echo Готово.
pause
script.ps1
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
add-type -as "system.io.compression.filesystem"
# Массив каталогов для архивации
$src = 'd:\!Каталог с пробелами\1\','e:\Каталог\2\'
# Путь и наименование текущих архивных файлов
$arc = 'c:\Temp\!arch\'
$nm = 'archive'
# Путь к каталогу со старыми архивами
$old = 'c:\Temp\!arch_old\'
# Создаем нумерованные архивы с проверками путей
$cnt = 0
$src|%{
    $cnt++
    if((
        test-path $_ -pathtype container
    ) -and (
        test-path $arc -pathtype container
    ) -and (
        test-path $old -pathtype container
    )){
        $a = $arc + $nm + "_" + $cnt + ".zip"
        if (test-path $a){mi $a $old -force}
        [io.compression.zipfile]::createfromdirectory($_, $a)
    } else {
        "Ошибка в перечне путей к каталогам. Возможно, это N"+$cnt
    }
}
1
сновидящий
18 / 0 / 0
Регистрация: 29.01.2014
Сообщений: 179
14.12.2017, 01:18 #14
нет, путанницы нет
0
14.12.2017, 01:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2017, 01:18
Привет! Вот еще темы с ответами:

Выбор папки из каталога - CMD/BAT
Ребят подскажите как реализовать выбор папки для последующего копирования из нее файлов? Суть такова есть папка temp в ней много папок с...

Проверка существования каталога - CMD/BAT
Привет всем. Есть каталог o:\2012-11 Это год и месяц соответственно, в конце месяца (в двадцатых числах) этот каталог удаляется и...

Поиск самого нового каталога - CMD/BAT
Доброго времени суток! Подскажите, пожалуйста, как реализовать или хотя бы с чего начать... Такая ситуация: Необходимо в каталоге найти...

Операции с файлами заданного каталога - CMD/BAT
1. Вывести на экран текущую дату. 2. Установить текущим каталогом H:\LEX, если первым аргументом командного файла задан каталог LEX или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru