Скрипты резервного копирования и Проверка копий Windows

Шаблоны заббикс мониторинг связанный с файлами и директориями
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Скрипты резервного копирования и Проверка копий Windows

Сообщение Артём Мамзиков »





Все скрипты запускаются через планировщик заданий

Файл БД выгружается SQL Агентом в 20ч
Далее запускается скрипт в 3Ч упаковку в архив созданием имени текущего дня и перемещается на другой сервер
Другой скрипт удаляет старые копии
create_backup.cmd
Показать
::@echo off
color 1a
:: Кодировка
chcp 1251
::Формирование переменной год месяц день
set D=%date:~0,2%
set M=%date:~3,2%
set Y=%date:~6,4%
set DMY=%Y%.%M%.%D%
::Подключение сетевого диска
net use Z: \\192.168.101.7\backups /user:логин пароль
:: Сжатие файла и перемещение по сети на другой сервер
"C:\Program Files (x86)\7-Zip\7zG.exe" a -tzip -mx7 Z:\BD_%DMY%.zip L:\basebackup\for_fs
:: Отключение сетевого диска
net use Z: /delete
без архива
Показать
::@echo off
color 1a
chcp 1251
set D=%date:~0,2%
set M=%date:~3,2%
set Y=%date:~6,4%
set DMY=%Y%.%M%.%D%
net use Z: \\192.168.101.7\backups /user:Логин Пароль
copy D:\basebackup\for_fs\*.* Z:\
ren Z:\sitex_bd_r01.bak BD_%DMY%.BAK
net use Z: /delet
Удаление старых копий
backup_delete.vbs
Показать
'Создание объектов
Set FSO3 = WScript.CreateObject("Scripting.FileSystemObject")
Set objNetwork = WScript.CreateObject("WScript.Network")

'Присваиваем значения переменным
strDriveName = "Z:"
strRemoteShare = "\\192.168.101.7\backups"
strUser = "Пользователь"
strPassw = "Пароль"

if FSO3.DriveExists(strDriveName) Then

'Выводим информацию на экран
'WScript.Echo "Диск " & strDriveName & " уже подключен"

else

'Подключаем диск Z:
WScript.Sleep 1000
objNetwork.MapNetworkDrive strDriveName, strRemoteShare, false, strUser, strPassw
WScript.Sleep 1000

End If

sFolderPath = "Z:\"
maxCount = 7
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(sFolderPath)
Set colFiles = oFolder.Files
If colFiles.Count>maxCount Then
' сформировали массив
Dim aFile()
ReDim aFile(colFiles.Count-1, 1)
Counter = 0
For Each oFiles in colFiles
aFile(Counter,0) = oFiles.Name
aFile(Counter,1) = oFiles.DateCreated
Counter = Counter +1
Next
Counter = Counter -1
' посортировали массив
For i = 0 To Counter
For j = i+1 To Counter
If aFile(i,1)<aFile(j,1) Then
VTmp = aFile(i,0)
aFile(i,0) = aFile(j,0)
aFile(j,0) = VTmp
VTmp = aFile(i,1)
aFile(i,1) = aFile(j,1)
aFile(j,1) = VTmp
End If
Next
Next
' удалили файлы
For i = maxCount To Counter
oFSO.DeleteFile(sFolderPath & aFile(i,0))
Next
End If

objNetwork.RemoveNetworkDrive "Z:"
1. Скрипт будет лежать на одном сервере (у сервера есть доступ ко всем проверяемым узлам) и будет работать по Траппер элементы данных (как активный агент но данные будет передавать скрипт) рядом со скриптом должен быть zabbix_sender.exe но лучше прописать переменную так как при запуске из планировщика может не отработать (например Path прописать ;C:\zabbix;)

в 8:30 запуск скрипта check_bk_fs.bat
Цикл перебора IP районов
\192.168.1ХХ.3\for_fs\*.bak
Каждый день в 20:20 выгрузка файла из SQl
Проверяем на следующий день дата изменения файла = минус один день от текущей даты если равно значит 1 нет 0

\\192.168.%1.7\backups\BD_%y%.%m%.%d%.*
Копия файла в архив каждый день сравниваем имя архива с текущей датой если = то проверяем дату изменения архива если текущая дата= то 1 если нет то 0
Получаем размер файла Проверяем что архив не битый высчитываем разность за сутки
Старый делим на новый должно быть не меньше <0.9 или
новый размер файла делить на старый значение должно быть не больше>1.1
Значение должно быть в районе 1
Так же получаем содержимое папки имя файла дата изменения размер в виде лога
Проверка файла выгруженного из SQL далее его упаковка в архив и копирование на другой сервер проверка
check_bk_fs.bat
Показать
@echo off
color 1a

:: Удаление старых логов более 31 день
forfiles /p "%~dp0log" /S /D -31 /C "cmd /c del /f /a /q @file"

SETLOCAL
:: Перебор IP подсетей с 1 по 28
for /L %%a in (101,1,128) do call:backup %%a
........
goto:eof

:backup
:: Проверка Копии за вчерашний день копия делается вечером скрипт запускается утром
set "sourcePath=\\172.16.%1.6\for_fs\*.bak"
:: Переменная если файл не найден ошибка
set good=0

:: Скрипт минус 1 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%

:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)

::високосным является не год, который делится без остатка на 4, а тот, который делится на 4, кроме тех, которые делятся на 100, но не делятся на 400
::set /a feb1=y%% 100
::set /a feb2=y%% 400

::set IsLeapYear=No
::if !feb2!==0 (set IsLeapYear=Yes) else (
::if !feb2!==0 (
::if not !feb1!==0 (set IsLeapYear=Yes)
::)
::)

:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Цифра месяца соответствует порядковому номеру в скобках
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
::Так как даты сравнивает до точки, делаем дату единым числом ггггммдд
set yesterdas=%y%%m:~-2%%d:~-2%
::Конец скрипта минус 1 день
setlocal DISABLEDELAYEDEXPANSION
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.%1.3\for_fs\*.bak') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bklogforfs%1 -o "%%p")
:: Запрос размера файла
for %%w in (\\192.168.%1.3\for_fs\*.bak) do set sizeforfs=%%~zw
:: Переменные
:: Искать в заданном расположении
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.-/ " %%j in ("%%~ti") do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %yesterdas% (
:: Если файл найден то good=1
set good=1
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_backup%1.6 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bksizeforfs%1 -o %sizeforfs%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_backup%1.6 -o 0)

:: Проверка копии в архиве на Файловом за сегодняшний день
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%
:: Переменная пути на файл
set "sourcePath=\\192.168.%1.9\es-backups\ES_%y%.%m%.%d%.*"
:: Переменная если файл не найден ошибка
set good=0

::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.%1.9\es-backups\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logbkfses%1 -o "%%p")
:: Запрос размера файла
for %%w in (\\192.168.%1.9\es-backups\ES_%y%.%m%.%d%.*) do set sizees=%%~zw
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Изменение файла = Текущая дата дд.мм.гггг
if %%j.%%k.%%l == %date% (
:: Если файл найден то good=1
set good=1
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_arxbackups%1.9 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bksizefses%1 -o %sizees%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_arxbackups%1.9 -o 0)

:: Создание Лога
::IF %1==128 call:log
::goto:pusto

::log
::check_bk_fs.bat>> %~dp0log\%date%check_bk_fs.log|goto:eof

::pusto
Старая версия
check_bk_fs.bat
Показать
@echo off
color 1a

SETLOCAL
:: Перебор IP подсетей с 1 по 28
for /L %%a in (101,1,128) do call:backup %%a
........
goto:eof

:backup
:: Проверка Копии за вчерашний день копия делается вечером скрипт запускается утром
set "sourcePath=\\192.168.%1.3\for_fs\*.bak"
:: Переменная если файл не найден ошибка
set good=0

:: Скрипт минус 1 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%

:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)

::високосным является не год, который делится без остатка на 4, а тот, который делится на 4, кроме тех, которые делятся на 100, но не делятся на 400
::set /a feb1=y%% 100
::set /a feb2=y%% 400

::set IsLeapYear=No
::if !feb2!==0 (set IsLeapYear=Yes) else (
::if !feb2!==0 (
::if not !feb1!==0 (set IsLeapYear=Yes)
::)
::)

:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Цифра месяца соответствует порядковому номеру в скобках
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set yesterday=%d:~-2%.%m:~-2%.%y%
::Конец скрипта минус 1 день
setlocal DISABLEDELAYEDEXPANSION
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.%1.3\for_fs\*.bak') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bklogforfs%1 -o "%%p")
:: Запрос размера файла
for %%w in (\\192.168.%1.3\for_fs\*.bak) do set sizeforfs=%%~zw
:: Переменные
:: Искать в заданном расположении
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.-/ " %%j in ("%%~ti") do (
if %%j.%%k.%%l == %yesterday% (
:: Если файл найден то good=1
set good=1
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_backup%1.3 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bksizeforfs%1 -o %sizeforfs%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_backup%1.3 -o 0)

:: Проверка копии в архиве на Файловом за сегодняшний день
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%
:: Переменная пути на файл
set "sourcePath=\\192.168.%1.7\backups\BD_%y%.%m%.%d%.*"
:: Переменная если файл не найден ошибка
set good=0
::Текущая дата дд.мм.гггг
set needDate=%date%

::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.%1.7\backups\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logbkfsbd%1 -o "%%p")
:: Запрос размера файла
for %%w in (\\192.168.%1.7\backups\BD_%y%.%m%.%d%.*) do set sizebd=%%~zw
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
if %%j.%%k.%%l == %needDate% (
:: Если файл найден то good=1
set good=1
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_arxbackups%1.7 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k bksizefsbd%1 -o %sizebd%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_arxbackups%1.7 -o 0)
При создании элемента в заббиксе Имя узла сети должно строго соответствовать имени Сервера или ПК откуда запускается скрипт в примере будет FILESERVER1
Элементы и Триггеры к check_bk_fs.bat
Показать
Повторяем создание для каждой подсети
Элементы и триггеры для файла из SQL
Показать
Группа элементов trapbacku
Элемент Создаем для каждой подсети
имя SR01 not_backup
Тип Zabbix траппер
Ключ not_backup101.3
Тип информации Числовой
История 90d

Файл выгруженный из базы SQL для упаковки в архив копии на ФС
За вечер предыдущего дня
1 -файл есть
0 - файла нет

\\SRXX\for_fs
Not 1XX.3 sitex_bd_rXX.bak

Триггер
Имя SR01 sitex backup {ITEM.LASTVALUE}
Важность выбираем
Выражение {FILESERVER1:not_backup101.3.last(#1)}=0 or {FILESERVER1:not_backup101.3.nodata(24h)}=1
Описание
в 8:30 запуск скрипта
Цикл перебора IP районов, подстановка даты в имя файла
\\192.168.%1.7\backups\BD_%y%.%m%.%d%.*
Копия файла в архив каждый день сравниваем имя архива с текущей датой если = то проверяем дату изменения архива если текущая дата= то 1 если нет то 0
1 -файл есть
0 - файла нет
Скрипт 40.90 D:\Backaps\zabbix_bk\copy_bk_fs.bat
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})
srbackup
srbackup
Проверка копий в архиве
Показать
Группа элементов trapbackup
Элемент Создаем для каждой подсети
имя FS01 not_arxbackup
Тип Zabbix траппер
Ключ not_arxbackups101.7
Тип информации Числовой
История 90d

Описание Файл выгруженный из базы SQL и зархивированый в архив на ФС
Текущего дня
1 -файл есть
0 - файла нет
\\FS101\backups
BD_ГГГГ.ММ.ДД.zip

Триггер для каждого элемента
Имя FS01 not_arxbackup {ITEM.LASTVALUE}
Важность выбираете нужную
Выражение:
{FILESERVER1:not_arxbackups101.7.last(#1)}=0 or
{FILESERVER1:not_arxbackups101.7.nodata(24h)}=1 or
{FILESERVER1:bksizefsesrn101.last(#2)}/{FILESERVER1:bksizefsesrn101.last()}<0.9 or {FILESERVER1:bksizefsesrn101.last()}/{FILESERVER1:bksizefsesrn101.last(#2)}>1.1

Описание
в 8:30 запуск скрипта
Цикл перебора IP районов, подстановка даты в имя файла
\\192.168.%1.7\backups\DB_%y%.%m%.%d%.*
Копия файла в архив каждый день сравниваем имя архива с текущей датой если = то проверяем дату изменения архива если текущая дата= то 1 если нет то 0
1 -файл есть
0 - файла нет
Скрипт 40.90 D:\Backaps\zabbix_bk\copy_bk_fs.bat
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})

nodata если нет никаких данных за 24 часа 1 , если данные есть 0 или
Проверяем что архив не битый
Старый делим на новый должно быть не меньше <0.9 или
новый размер файла делить на старый значение должно быть не больше>1.1
Значение должно быть в районе 1 Нет данных или больше 10% процентов разница
fsbackup
fsbackup
Запрос размера файла Элементы
Показать
группа элементов SizeTrapperBakup
Элемент
Имя BkSizeforfs101
Тип Zabbix Траппер
Ключ bksizeforfs101
Тип информации Целое число
Единица измерения b
Хранение 14d
Описание
Размер файла последнего бекапа BD
Каждый день
:: Запрос размера файла
for %%w in (\\192.168.%1.3\for_fs\*.bak) do set sizeforfs=%%~zw

Элемент
Имя BkSizeFsBD101
Тип Zabbix Траппер
Ключ bksizefs101
Тип информации Целое число
Единица измерения b
Хранение 14d
Описание
Размер файла последнего бекапа BD на ФС
Каждый день
:: Запрос размера файла
for %%w in (\\192.168.%1.7\backups\BD_%y%.%m%.%d%.*) do set sizeesrn=%%~zw
sizebackup
sizebackup
Элементы для получения содержимого папки лог
Показать
Группа элементов LogTrapperBakup
Элемент bklogforfs101
Тип Zabbix Траппер
Ключ bklogforfs101
Тип информации Текст
Период хранения истории 14d
Описание
Структура каталога каждый день
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.%1.3\for_fs\*.bak') do

Элемент
Имя LogBkFS101
Тип Zabbix Траппер
Ключ logbkfs101
Тип информации Текст
Период хранения истории 14d
Описание
Структура каталога каждый день на ФС Копии BD
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.%1.7\backups\') do
logbackup
logbackup
@echo off
color 1a

:: Скрипт минус 1 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%
:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Значение минус месяц деление по модулю четного числа
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set yesterday=%d:~-2%.%m:~-2%.%y%
::Так как даты сравнивает до точки, делаем дату единым числом ггггммдд
set numyesterday=%y%%m:~-2%%d:~-2%
::Конец скрипта минус 1 день
setlocal DISABLEDELAYEDEXPANSION

::С 00 05ч каждый день кроме СБ и ВС дифах Имя файла минус день проверка в 9 00 (файл diff_17.09.2019.7z 17.09.2019 8:02)
::Переменная пути на файл
set "sourcePath=D:\!BackupsDoks\diff_mounts\diff_%%a.%%b.%%c.7z"
:: Запрос содержание данной директории в текстовом формате
for /f "Skip=5 eol= delims=" %%p in ('dir D:\!BackupsDoks\diff_mounts\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkLogDiffFS17.9 -o "%%p")
:: Запрашиваем содержимое папки ищем строки с архивом оставляем 4 столбец имя арахива обрезаем по _
for /F " tokens=7,8,9 delims=.|_ " %%a in ('dir D:\!BackupsDoks\diff_mounts\^|FIND /I "7z"') do (
::Дата файла больше или равно >= минус текущий день (если да выполняем скрипт дальше)
if %%c%%b%%a GEQ %numyesterday% (
:: Запрос размера файла
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkSizeDiffFS17.9 -o "%%~zk")
::День недели
for /f "Skip=1" %%d In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
:: Проверка с понедельниа по субботу включительно
if %%d GEQ 1 (
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %numyesterday% (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k DiffFsBk17.9 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k DiffFsBk17.9 -o 0)
)
)
)
)
)
)
)
)

::С 7 00ч суббота раз в неделю (суботы на воскресенье) Имя файла минус день проверка в 9 00 ВС (файл full.7z 13.09.2019 20:45)
::Переменная пути на файл
set "sourcePath=D:\!BackupsDoks\FULL_mounts\full.7z"
:: Запрос содержание данной директории в текстовом формате
for /f "Skip=5 eol= delims=" %%p in ('dir D:\!BackupsDoks\FULL_mounts\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkLogFullFS17.9 -o "%%p")
::День недели
for /f "Skip=1" %%d In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
if %%d == 0 (
:: Проверка Воскресенье
:: Запрос размера файла
for %%k in ("%sourcePath%") do set BkSizeFullFS=%%~zk
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
::Дата изменения файла больше или равно минус текущий день
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
if %%l%%k%%j GEQ %numyesterday% (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k FullFSBk17.9 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkSizeFullFS17.9 -o %BkSizeFullFS%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k FullFSBk17.9 -o 0)
)
)
)
)
)
)


::С 7 00ч в ВС раз в неделю (вс до пн) Имя файла минус день проверка в 9 00 ПН (файл full1s02.08.2020.7z)
::Переменная пути на файл
set "sourcePath=D:\!BackupsDoks\1s_mounts\full1s%%b.%%c.%%d.7z"
:: Запрос содержание данной директории в текстовом формате
for /f "Skip=5 eol= delims=" %%p in ('dir D:\!BackupsDoks\1s_mounts\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkLog1sFS17.9 -o "%%p")
::День недели
for /f "Skip=1" %%d In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
:: Проверка Понедельник
if %%d == 1 (
:: Запрашиваем содержимое папки ищем строки с архивом оставляем 4 столбец имя арахива оставляем дату из имени
for /F " tokens=7,8,9 delims=_|full1s|. " %%b in ('dir D:\!BackupsDoks\1s_mounts\^|FIND /I "7z"') do (
::Дата файла больше или равно >= минус текущий день (если да выполняем скрипт дальше)
if %%d%%c%%b GEQ %numyesterday% (
:: Запрос размера файла
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k BkSize1sFS17.9 -o "%%~zk")
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %numyesterday% (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k 1sFSBk17.9 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s BUHSER -k 1sFSBk17.9 -o 0)
)
)
)
)
)
)
)
)

:: Удаление старых логов более 31 день
forfiles /p "%~dp0log" /S /D -31 /C "cmd /c del /f /a /q @file"
Еще пример на бухсервер
Показать
2.Еще один вариант скрипта более простой который запрашивает только размер файла (еще дополнительно пишет в журнал внештатных ситуацай)
zabbix_bk.vbs
Показать
'Option Explicit

Dim strFolder
Dim strMask
Dim strServerName

Dim objFSO
Dim objRegExp
Dim objFile

Dim boolFound

Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

Dim xmlHTTP, adr, PostData, strDate
Set xmlHTTP = CreateObject("Microsoft.XMLHTTP")
adr="http://192.168.175.4/glpi/journals/addRecord.php"

Public Filials
Filials = 0

strMask = Right(0 & Year(Date), 4) & "." & Right(0 & Month(date), 2) & "." & Right(0 & Day(date), 2)
strDate = Right(0 & Day(date), 2) & "." & Right(0 & Month(date), 2) & "." & Right(0 & Year(Date), 4)

For n=1 to 28
if n<10 then
strFolder = "\\192.168.10"+CStr(n)+".7\backups\"
strServerName = "0"+CStr(n)
else
strFolder = "\\192.168.1"+CStr(n)+".7\backups\"
strServerName = CStr(n)
End If

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objRegExp = WScript.CreateObject("VBScript.RegExp")

With objRegExp
.Pattern = strMask
.IgnoreCase = True
End With

If objFSO.FolderExists(strFolder) Then
boolFound = False
For Each objFile In objFSO.GetFolder(strFolder).Files
If objRegExp.Test(objFile.Name) Then
boolFound = True
PostData = "id=5&f40=Server_" & strServerName & "&f42=full_backup&f43=Windows_Server_2008_R2&f44=.bak&f45=FS2" & strServerName & "&f46=" & strDate & "&f47=" & objFile.Size

xmlHTTP.Open "POST", adr, False
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlHTTP.Send PostData

WshShell.Run "D:\!Backaps\zabbix_bk\zabbix_sender.exe -z 192.168.175.111 -s FILESERVER1 -k trapbackup" & strServerName & " -o " & objFile.Size, 0, true
'WshShell.Run "zabbix_sender.exe -z 192.168.175.111 -s FS" & strServerName & " -k trapbackup03 -o " & objFile.Size, 0, true'
End If
Next

If boolFound Then
Filials = Filials + 1
Else

End If
Else

End If

Set objRegExp = Nothing
Set objFSO = Nothing
next

WScript.Quit 0
Элемент и Триггер
Показать
Группа trapbackup
Имя backup01
Тип Zabbix траппер
Ключ backup01
Тип информации Числовой целое
Единица измерения b
Период хранения истории 90d

Триггер
Имя NoBackup01
Важность задаем
Выражение
{FILESERVER1:trapbackup01.nodata(24h)}=1 or {FILESERVER1:trapbackup01.last(#2)}/{FILESERVER1:trapbackup01.last()}<0.9 or {FILESERVER1:trapbackup01.last()}/{FILESERVER1:trapbackup01.last(#2)}>1.1

Описание
nodata если нет никаких данных за 24 часа 1 , если данные есть 0 или
Проверяем что архив не битый
Старый делим на новый должно быть не меньше <0.9 или
новый размер файла делить на старый значение должно быть не больше>1.1
Значение должно быть в районе 1
через vbs
через vbs
Как выглядят Последние данные по данным скриптам 1 и 2 варианта
Последние данные
Последние данные

3.Старая проверка скрипт отправка на почту со своими минусами
Удаляет старый файл report.txt (в который выводятся ошибки проверки)
Проверка доступности пингом БД и ФС
Проверка создался ли новый файл копии на сервере БД из SQL и Архив на ФС
Если есть ошибки создается report.txt со всеми ошибками которые были в процессе
Далее если файл существует запускается батник (лежит в этой же папке что и проверочный на ошибки, если нет надо прописать путь) отправки почты .
Почта берет текст ошибок проверок из этого файла report.txt и отправляет на указанную электронку!
Минусы если сервер был выключен скрипт не отработал можно выставить запускать скрипт если был пропущен запуск, если нет инета почта не уйдет и повторно ничего отправлятся не будет или покакой то причине не отработала почта
Почтовая утилита stunnel-5.44-win32-installer.exe настраивается конфиг почты stunnel.conf
bk_proverka.bat
Показать
@echo off
color 1a
:: Перед проверкой удалим лог предыдущий
DEL /F /S /Q /A "D:\report.txt"

TITLE proverka serverov
:proverka ping
:: сервер 1
echo SR01
ping -n 4 192.168.101.3 | find "TTL=" > nul
if %ERRORLEVEL% EQU 0 echo conect
if %ERRORLEVEL% EQU 1 echo ping 1xx.3 disconect >> D:\report.txt
:proverka
:: сервер 2
echo FSS101
ping -n 4 192.168.101.7 | find "TTL=" > nul
if %ERRORLEVEL% EQU 0 echo conect
if %ERRORLEVEL% EQU 1 echo ping 2xx.7 disconect >> D:\report.txt
TIMEOUT /T 2
cls

set "sourcePath=\\192.168.101.3\basebackup\for_fs"
set good=0
set needDate=%date%

for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
if %%j.%%k.%%l == %needDate% (
set good=1
)
)
)

if %good% == 0 (
echo 1XX.3 Not found backup dated %needDate% >> D:\report.txt
)

set "sourcePath=\\192.168.101.7\esrn-backups"
set good=0
set needDate=%date%

for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
if %%j.%%k.%%l == %needDate% (
set good=1
)
)
)

if %good% == 0 (
echo 1XX.7 Not found backup dated %needDate% >> D:\report.txt
)

dir /b/a-d/s "D:\report.txt" && START "Pohta" Batpohta.bat || echo Bad!

exit
Batpohta.bat
Показать
set file_blat=blat.exe
set file_text=D:\report.txt
set file_log=D:\log_blat.txt
set from_server=127.0.0.1
set from_port=587
set from_mail=логин@mail.ru
set from_name=логин@mail.ru
set from_pass=***
set to_mail=кому@mail.ru
set to_subject="Rezervnai copy fs101"
%file_blat% %file_text% -server %from_server%:%from_port% -f %from_mail% -u %from_name% -pw %from_pass% -to %to_mail% -s %to_subject% -log %file_log%
exit
Настройка почтовой программы
Показать
Напрямую батник не может отправить сообщение используем для этого библиотеки и приложение blat
Копируем 4 файла из папки full в папку System32

Команда в батнике
set file_blat=blat.exe – Запуск вспомогательной програмки
set file_text=D:\report.txt - Блокнот из которого берется текст сообщения
set file_log=D:\log_blat.txt – Лог исполнения
set from_server=127.0.0.1 – сервер исходящей почты
set from_port=587 – порт исходящей почты
set from_mail=логин@mail.ru - Данные пользователя от которого будет отправлено сообщение
set from_name=логин@mail.ru - Данные пользователя от которого отправляется сообщение
set from_pass=**** - Пароль
set to_mail=логин@mail.ru – Кому отправляем
set to_subject="Rezervnai copy fs101" – Тема сообщения
%file_blat% %file_text% -server %from_server%:%from_port% -f %from_mail% -u %from_name% -pw %from_pass% -to %to_mail% -s %to_subject% -log %file_log% - Исполняющая команда

Если в почте используется SSL нужна еще одна прогрммка например stunnel-5.44-win32-installer Запускается служба
https://www.stunnel.org/downloads.html

Устанавливаем редактируем файлик C:\Program Files (x86)\stunnel\stunnel.conf
например для майла
[mail-pop3]
client = yes
accept = 127.0.0.1:110
connect = pop.mail.ru:995
[mail-smtp]
client = yes
accept = 127.0.0.1:587
connect = smtp.mail.ru:465

В свою очередь программа переадресовывает на локальный адрес 127.0.0.1 который мы указали в батнике
На основе https://infostart.ru/public/403899/
После перезапуска компа программа не стартанула stunnel AllUsers и поста не отправлялась команда отрабатывала сама отправка не происходила
Команды использовавшиеся в скриптах
Некоторые команды cmd
Показать
ASSOC Вывод либо изменение сопоставлений по расширениям имен файлов.
AT Выполнение команд и запуск программ по расписанию.
ATTRIB Отображение и изменение атрибутов файлов.
BREAK Включение/выключение режима обработки комбинации клавиш CTRL+C.
CACLS Отображение/редактирование списков управления доступом (ACL) к файлам.
CALL Вызов одного пакетного файла из другого.
CD Вывод имени либо смена текущей папки.
CHCP Вывод либо установка активной кодовой страницы.
CHDIR Вывод имени либо смена текущей папки.
CHKDSK Проверка диска и вывод статистики.
CHKNTFS Отображение или изменение выполнения проверки диска во время загрузки.
CLS Очистка экрана.
CMD Запуск еще одного интерпретатора командных строк Windows.
COLOR Установка цвета текста и фона, используемых по умолчанию.
COMP Сравнение содержимого двух файлов или двух наборов файлов.
COMPACT Отображение/изменение сжатия файлов в разделах NTFS.
CONVERT Преобразование дисковых томов FAT в NTFS. Нельзя выполнить
преобразование текущего активного диска.
COPY Копирование одного или нескольких файлов в другое место.
DATE Вывод либо установка текущей даты.
DEL Удаление одного или нескольких файлов.
DIR Вывод списка файлов и подпапок из указанной папки.
DISKCOMP Сравнение содержимого двух гибких дисков.
DISKCOPY Копирование содержимого одного гибкого диска на другой.
DOSKEY Редактирование и повторный вызов командных строк; создание макросов.
ECHO Вывод сообщений и переключение режима отображения команд на экране.
ENDLOCAL Конец локальных изменений среды для пакетного файла.
ERASE Удаление одного или нескольких файлов.
EXIT Завершение работы программы CMD.EXE (интерпретатора командных строк) .
FC Сравнение двух файлов или двух наборов файлов и вывод различий между
ними.
FIND Поиск текстовой строки в одном или нескольких файлах.
FINDSTR Поиск строк в файлах.
FOR Запуск указанной команды для каждого из файлов в наборе.
FORMAT Форматирование диска для работы с Windows.
FTYPE Вывод либо изменение типов файлов, используемых при сопоставлении по
расширениям имен файлов.
GOTO Передача управления в отмеченную строку пакетного файла.
GRAFTABL Позволяет Windows отображать расширенный набор символов в графическом
режиме.
HELP Выводит справочную информацию о командах Windows.
IF Оператор условного выполнения команд в пакетном файле.
LABEL Создание, изменение и удаление меток тома для дисков.
MD Создание папки.
MKDIR Создание папки.
MODE Конфигурирование системных устройств.
MORE Последовательный вывод данных по частям размером в один экран.
MOVE Перемещение одного или нескольких файлов из одной папки в другую.
PATH Вывод либо установка пути поиска исполняемых файлов.
PAUSE Приостановка выполнения пакетного файла и вывод сообщения.
POPD Восстановление предыдущего значения текущей активной папки,
сохраненного с помощью команды PUSHD.
PRINT Вывод на печать содержимого текстовых файлов.
PROMPT Изменение приглашения в командной строке Windows.
PUSHD Сохранение значения текущей активной папки и переход к другой папке.
RD Удаление папки.
RECOVER Восстановление читаемой информации с плохого или поврежденного диска.
REM Помещение комментариев в пакетные файлы и файл CONFIG.SYS.
REN Переименование файлов и папок.
RENAME Переименование файлов и папок.
REPLACE Замещение файлов.
RMDIR Удаление папки.
SET Вывод, установка и удаление переменных среды Windows.
SETLOCAL Начало локальных изменений среды для пакетного файла.
SHIFT Изменение содержимого (сдвиг) подставляемых параметров для пакетного
файла.
SORT Сортировка ввода.
START Запуск программы или команды в отдельном окне.
SUBST С
Команда DIR
Показать
Команда DIR позволяет отобразить список файлов и подкаталогов для указанного каталога. Список может быть отсортирован по множеству критериев, задаваемых параметрами командной строки.
Формат командной строки:
DIR [диск:][путь][имя_файла] [/A[[:]атрибуты]] [/B] [/C] [/D] [/L] [/N] [/O[[:]порядок]] [/P] [/Q] [/S] /T[[:]время]] [/W] [/X] [/4]

Параметры командной строки:
[диск:][путь][имя_файла] - Диск, каталог и/или файлы, которые следует включить в список.

/A - Вывод файлов с указанными атрибутами:
D Каталоги
R Доступные только для чтения
H Скрытые файлы
A Файлы для архивирования
S Системные файлы
Префикс "-" имеет значение НЕ
-S НЕ системные файлы.

/B - Вывод только имен файлов.
/C - Применение разделителя групп разрядов для вывода размеров файлов (по умолчанию). Для отключения этого режима служит ключ /-C.
/D - Вывод списка в несколько столбцов с сортировкой по столбцам.
/L - Использование нижнего регистра для имен файлов.
/N - Отображение имен файлов в крайнем правом столбце.
/O - Сортировка списка отображаемых файлов.

Порядок: N По имени (алфавитная), S По размеру (сперва меньшие), E По расширению (алфавитная), D По дате (сперва более старые), G Начать список с каталогов. Префикс "-" имеет значение НЕ
/P - Пауза после заполнения каждого экрана.
/Q - Вывод сведений о владельце файла.
/R - Отображение альтернативных потоков файлов.
/S - Вывод списка файлов из указанного каталога и его подкаталогов.
/T - Выбор поля времени для отображения и сортировки

время:
C Создание (время создания - Create )
A Последнее использование (последний доступ - Accsess )
W Последнее изменение (последняя модификация Write)
/W - Вывод списка в несколько столбцов.
/X - Отображение коротких имен для файлов, чьи имена не соответствуют стандарту 8.3. Формат аналогичен выводу с ключом /N, но короткие имена файлов выводятся слева от длинных. Если короткого имени у файла нет, вместо него выводятся пробелы.
/4 - Вывод номера года в четырехзначном формате

Стандартный набор ключей можно записать в переменную среды DIRCMD. Для отмены их действия введите в команде те же ключи с префиксом "-", например: /-W
dir 123.txt /T:C покажет дату создания.
dir 123.txt /T:W покажет дату изменения.
dir "*"
Цикл FOR
tokens - данный параметр командной стоки цикла for cmd позволяет указать, какие номера полей строки, полученных из заданного текста, нужно передать для обработки в цикл. Полученные поля будут храниться в отдельной переменной. Фактически, если принимать каждое слово строки как отдельный элемент, то параметр tokens позволяет указать, какие именно слова по счету нужно обработать. Как упоминалось выше, стандартным разделителем является пробел и табуляция. Для дополнительной переменной, как и для переменной инициализации, в качестве имени указывается латинская буква, большая или маленькая. Значения можно указывать как через запятые, например, “tokens=1,4, 9” – первый, четвертый и девятый элемент, так и через диапазон, например, “tokens=4-11” – с четвертого по одиннадцатый. Можно комбинировать: “tokens=4-10,15,20” – с четвертого по десятый, а также, пятнадцатый и двадцатый элемент. Если мы укажем в качестве последнего значения звездочку, то создастся еще одна переменная, которая будет хранить в себе все остальные элементы (строки) текста.
delims – параметр позволяет задать дополнительные разделители строки на подстроки. Так, стандартными разделителями является пробел и символ табуляции. Например, “delims=,.:” – тут мы определили, что запятые, точки и двоеточия являют­ся разделителями.
Skip - позволяет в цикле cmd for задать количество строк, которые нужно пропустить, счет идет с начала файла, например
eol – позволяет задать признак концевого комментария Весь текст, что будет находиться после него, будет приниматься за комментарий
%~tI - переменная %I расширяется до даты /времени файла
EQU - равно, идентично оператору ==
NEQ - не равно
LSS - меньше, чем
LEQ - меньше или равно
GTR - больше, чем
GEQ - больше или равно
а ключ /I, если он указан, задает сравнение текстовых строк без учета регистра

команда1 & команда2 — Используется для разделения нескольких команд в одной командной строке. В cmd.exe выполняется первая команда, затем вторая команда.

команда1 && команда2 — Запускает команду, стоящую за символом &&, только если команда, стоящая перед этим символом была выполнена успешно. В cmd.exe выполняется первая команда. Вторая команда выполняется, только если первая была выполнена успешно.

команда1 || команда2 — Запускает команду, стоящую за символом ||, только если команда, стоящая перед символом || не была выполнена. В cmd.exe выполняется первая команда. Вторая команда выполняется, только если первая не была выполнена (полученный код ошибки превышает ноль).
получение день неделя месяц и тп
Показать
@Echo Off
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Day') Do Set $Day=%%i&GoTo Day
:Day
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Month') Do Set $Month=%%i&GoTo Month
:Month
For /F "Tokens=%$Month% Delims=," %%i In ("Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь") Do Set $MonthName=%%i
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Year') Do Set $Year=%%i&GoTo Year
:Year
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get DayOfWeek') Do Set /A $DayOfWeek=%%i+1&GoTo DayOfWeek
:DayOfWeek
For /F "Tokens=%$DayOfWeek% Delims=," %%i In ("Воскресенье,Понедельник,Вторник,Среда,Четверг,Пятница,Суббота") Do Set $DayOfWeekName=%%i
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get WeekInMonth') Do Set $WeekInMonth=%%i&GoTo WeekInMonth
:WeekInMonth
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Hour') Do Set $Hour=%%i&GoTo Hour
:Hour
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Minute') Do Set $Minute=%%i&GoTo Minute
:Minute
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Second') Do Set $Second=%%i&GoTo Second
:Second
Echo --------------------------------------
Echo День : %$Day%
Echo Месяц : %$MonthName% (%$Month%-й месяц года)
Echo Год : %$Year%
Echo --------------------------------------
Echo День недели : %$DayOfWeekName% (%$DayOfWeek%-й день недели)
Echo Неделя месяца: %$WeekInMonth%
Echo --------------------------------------
Echo Часов : %$Hour%
Echo Минут : %$Minute%
Echo Секунд : %$Second%
Echo --------------------------------------
Скрипт минус день с учтетом месяца года
Показать
:: Скрипт минус 1 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%

:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)

::високосным является не год, который делится без остатка на 4, а тот, который делится на 4, кроме тех, которые делятся на 100, но не делятся на 400
::set /a feb1=y%% 100
::set /a feb2=y%% 400

::set IsLeapYear=No
::if !feb2!==0 (set IsLeapYear=Yes) else (
::if !feb2!==0 (
::if not !feb1!==0 (set IsLeapYear=Yes)
::)
::)

:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Цифра месяца соответствует порядковому номеру в скобках
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set yesterday=%d:~-2%.%m:~-2%.%y%
::Конец скрипта минус 1 день
setlocal DISABLEDELAYEDEXPANSION
Как в скрипте находится високосный год например)
% деление по модулю является остаток от целочисленного деления
2019:4 = 504.75
504*4 = 2016
2019-2016=3

2020:4 = 505
505*4 = 2020
2020-2020 = 0

2021:4 = 505.25
505*4 = 2020
2021-2020 = 1
и так по кругу и узнаем високосный год))
Последний раз редактировалось Артём Мамзиков Вс окт 06, 2019 20:53, всего редактировалось 9 раз. количество слов: 3755
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Скрипты резервного копирования и Проверка копий

Сообщение Артём Мамзиков »

Запилено все в один скрипт можно было сделать все разными скриптами и планировщиком заданий было бы проще

Проверка в 5 директориях в разные дни и недели
Нас хранилище
Описание как проверяем
\\192.168.175.59\директория\BACKFS\DOM\
Ежедневно в 6.26 full12.09.2019 файл на каждый день (множество файлов)
Идем в папку находим файл текущей датой Идем в папку находим файл текущей датой сегодня если нет ошибка если да то 1
Триггер задан нет данных за 24 ошибка и так же если значение не 1 за 24 часа ошибка

\\192.168.175.59\директория\BACKFS\ZimbraBK\
архив зимбры каждый четверг 7:50 ZimbraBK.tar 8:15 один файл
Идем в папку находим файл с раширением gz если нет ошибка , проверяем день недели если не 4 четверг то ошибка , если 4 то продолжаем
скрипт файл найден проверяем то что изменения его сегодня если нет ошибка если да то 1
Триггер задан нет данных за 7дней ошибка и так же если значение не 1 за 7 дней ошибка

\\192.168.175.59\директория\BACKFS\Proxmox\
каждый понедельник 23:30 ProxmoxBK_2019-09-09.tar 09.09.2019 23:30
Идем в папку находим файл минус 1 день на моент проверки для сравнения т.к. проверяем утром во Вторник (а скрипт понедельник вечер)
файл найден сравниваем то что сегодня вторник. если вторник то сравниваем дату изменения файла понедельника совпало ОК 1 во всех остальных случаях 0
Триггер задан нет данных за 7дней ошибка и так же если значение не 1 за 7 дней ошибка

\\192.168.175.59\директория\BACKFS\Docs\FULL_mounts\
туда скидываеться архив каждую суботу начала месяца 6:20
Имя 03.08.2019_-7d дата изменения 28.07.2019 5:30 Создания 28.07.2019 5:30 Вс (отличие даты 6 дней)
бэк кидаеться туда позже на неделю сначала имя full кнему неделю делаются диференцированные бэки, а через неделю он переименовываеться и отправляеться в копии и дата
Идем в папку находим файл текущей датой на день проверки это первая суббота месяца Идем в папку находим файл с датой минус 6 дней от текущей и сравниваем если все Ок то значение 1
Триггер если данных нет за 36 день (так как суббота может быть 1 числом месяца 31 +5 максимальное количество ожидания),
так как данные приходят только именно в 1 субботу месяца они могут быть 1 или 0 то 2 проверка будет .last()=0

\\192.168.175.59\дириктория\BACKFS\Docs\
туда скидываеться архив каждую суботу 2,3,4,5 недели месяца 6:20
Имя 03.08.2019_-7d дата изменения 28.07.2019 5:30 Создания 28.07.2019 5:30 Вс (отличие даты 6 дней)
бэк кидаеться туда позже на неделю сначала имя full кнему неделю делаются диференцированные бэки, а через неделю он переименовываеться и отправляеться в копии и дата
Идем в папку находим файл текущей датой на день проверки это субботы месяца Идем в папку находим файл с датой минус 6 дней от текущей и сравниваем если все Ок то значение 1
Триггер если данных нет за 14 день (так как вс может быть 1 числом месяца 7 это 1 суббота, 14 вторя неделя субботы поэтому 14 максимальное количество ожидания),
так как данные приходят только именно в 1 субботу месяца они могут быть 1 или 0 то 2 проверка будет .last()=0

Запрашивается Лог по содержанию папки , Размер проверяемого файла, Значение самой проверки 0 или 1
(в некоторых случаях данные идут только в определенный день когда условия цикла совпадают равны текущей недели и конкретному дню, можно спустить ответ цикла в завершение определенной части скрипта и ответ будет приходить каждый день но в это случае сложнее задать триггер)

Переменная пути на файл (обратить внимание где переменная на файл и в нее попадают несколько файлов например *7z, если цикл выше не соотвествует непрошла проверка по дате, то ниже цикл по файлам переменной проверит их все равно и это будет не корректно будет верный файл 1 и еще прилетит 0 так же и поразмерам файла)
copy_bk.bat
Показать
@echo off
color 1a

::Формируем дату для сравнение одним занчением yyyymmdd
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

set yyyymmdd=%y%%m%%d%
set dd_mm_yyyy=%d%_%m%_%y%

:: Проверка копии в архиве каждый день (имя архива full12.09.2019.7z в 6:30)
:: Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\172.16.14.9\Volume_1\BACKFSCentr\DOM\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k log_fullbackups -o "%%p")
:: Переменная пути на файл
set "sourcePath=\\172.16.14.9\Volume_1\BACKFSCentr\DOM\full%date%.7z"
:: Переменная если файл не найден ошибка
set good=0
:: Запрос содержание данной директории в текстовом формате
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k size_fullbackups -o "%%~zk")
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла меньше или равно =< текущий день
if %%l%%k%%j LEQ %yyyymmdd% (
:: Если файл найден то good=1
set good=1
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_fullbackups -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_fullbackups -o 0)


:: Скрипт минус 1 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%
:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Цифра месяца соответствует порядковому номеру в скобках
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
::Так как даты сравнивает до точки, делаем дату единым числом ггггммдд
set yesterdas=%y%%m:~-2%%d:~-2%
set ryesterday=%y%-%m:~-2%-%d:~-2%
set denyyyy_mm_dd=%y%_%m:~-2%_%d:~-2%
::Конец скрипта минус 1 день
setlocal DISABLEDELAYEDEXPANSION

:: Проверка копий по дням недели Где понедельник - 1 ,Суббота - 6 , Воскресенье - 0
:: Проверка копии в архиве на Файловом Воскресенье (имя архива ZimbraBK.tar в 8:20)
:: Переменная пути на файл
set "sourcePath=\\172.16.14.9\Volume_1\BACKFSCentr\ZimbraBK\*.tar.gz"
:: Переменная если файл не найден, не совпала дата изменения с текущей или не первый четверг в месяце то ошибка
set good=0
::День недели
for /f "Skip=1" %%d In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
if %%d == 0 (
:: Если 0 Воскресенье
:: Запрос содержание данной директории в текстовом формате
for /f "Skip=5 eol= delims=" %%p in ('dir \\172.16.14.9\Volume_1\BACKFSCentr\ZimbraBK\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logZimbraBK14.12 -o "%%p")
:: Запрос размера файла
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k sizeZimbraBK14.12 -o "%%~zk")
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат (изменения файла = *)
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %yesterdas% (
set good=1
)
)
)
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k ZimbraBK14.12 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k ZimbraBK14.12 -o 0)


:: Проверка копий по дням недели Где понедельник - 1 ,Суббота - 6 , Воскресенье - 0
:: Проверка копии архива Понедельник проверяем утро Вторник (имя архива ProxmoxBK_2019-09-09.tar в 23:30)
:: Переменная если файл не найден, не совпала дата изменения с текущей или не понедельник то ошибка
set good=0
:: Переменная пути на файл
set "sourcePath=\\172.16.14.9\Volume_1\BACKFSCentr\Proxmox\ProxmoxBK_%ryesterday%.tar.gz"
::День недели
for /f "Skip=1" %%d In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
if %%d == 2 (
::Если 2 вторник
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\172.16.14.9\Volume_1\BACKFSCentr\Proxmox') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logProxmox14.27 -o "%%p")
:: Запрос размера файла
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k sizeProxmoxBK14.27 -o "%%~zk")
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %yesterdas% (
set good=1
)
)
)
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k ProxmoxBK14.27 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k ProxmoxBK14.27 -o 0)


:: Проверка каждый день ЭЛМЫ 14.25
:: Переменная пути на файл .bak
set "sourcePath=\\172.16.14.25\Backs2\elma_backup\elma_backup_day\ELMA_%dd_mm_yyyy%\ELMA3_backup_%denyyyy_mm_dd%_*.bak"
:: Переменная если файл не найден, не совпала дата изменения с текущей или не первый четверг в месяце то ошибка
set good=0
:: Запрос содержание данной директории в текстовом формате
for /f "Skip=5 eol= delims=" %%p in ('dir \\172.16.14.25\Backs2\elma_backup\elma_backup_day\ELMA_%dd_mm_yyyy%\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "DS1019 Synology Inc" -k logElmaBK14.25 -o "%%p")
:: Запрос размера файла
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "DS1019 Synology Inc" -k sizeElmaBK14.25 -o "%%~zk")
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат (изменения файла = *)
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %yesterdas% (
set good=1
)
)
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "DS1019 Synology Inc" -k ElmaBK14.25 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "DS1019 Synology Inc" -k ElmaBK14.25 -o 0)

:: Переменная пути на файл .trn
set "sourcePath=\\172.16.14.25\Backs2\elma_backup\elma_backup_day\ELMA_%dd_mm_yyyy%\ELMA3_backup_%denyyyy_mm_dd%_*.trn"
:: Переменная если файл не найден, не совпала дата изменения с текущей или не первый четверг в месяце то ошибка
set good=0
:: Запрос размера файла
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "DS1019 Synology Inc" -k sizeElmaTRN14.25 -o "%%~zk")
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат (изменения файла = *)
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %yesterdas% (
set good=1
)
)
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "DS1019 Synology Inc" -k ElmaTRN14.25 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "DS1019 Synology Inc" -k ElmaTRN14.25 -o 0)

::Проверка каждый день ЭЛМЫ .14.17
:: Переменная пути на файл .bak
set "sourcePath=\\172.16.14.17\d$\backupelma_full\elma\ELMA_%dd_mm_yyyy%\ELMA3_backup_%denyyyy_mm_dd%_*.bak"
:: Переменная если файл не найден, не совпала дата изменения с текущей или не первый четверг в месяце то ошибка
set good=0
:: Запрос содержание данной директории в текстовом формате
for /f "Skip=5 eol= delims=" %%p in ('dir \\172.16.14.17\d$\backupelma_full\elma\ELMA_%dd_mm_yyyy%\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "dom5" -k logElmaBK14.17 -o "%%p")
:: Запрос размера файла
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "dom5" -k sizeElmaBK14.17 -o "%%~zk")
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат (изменения файла = *)
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %yesterdas% (
set good=1
)
)
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "dom5" -k ElmaBK14.17 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "dom5" -k ElmaBK14.17 -o 0)

:: Переменная пути на файл .trn
set "sourcePath=\\172.16.14.17\d$\backupelma_full\elma\ELMA_%dd_mm_yyyy%\ELMA3_backup_%denyyyy_mm_dd%_*.trn"
:: Переменная если файл не найден, не совпала дата изменения с текущей или не первый четверг в месяце то ошибка
set good=0
:: Запрос размера файла
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "dom5" -k sizeElmaTRN14.17 -o "%%~zk")
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат (изменения файла = *)
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла больше или равно минус текущий день
if %%l%%k%%j GEQ %yesterdas% (
set good=1
)
)
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "dom5" -k ElmaTRN14.17 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s "dom5" -k ElmaTRN14.17 -o 0)


:: Скрипт минус 7 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%
:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Цифра месяца соответствует порядковому номеру в скобках
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
:: минус 7 день set /a d-=7
set /a d-=7
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set yesterdayh=%y%%m:~-2%%d:~-2%

::Конец скрипта минус 7 день
setlocal DISABLEDELAYEDEXPANSION

:: Проверка копий по дням недели Где понедельник - 1 ,Суббота - 6 , Воскресенье - 0
:: Проверка копии в архиве на Файловом первая Суббота месяца (имя архива 07.09.2019_-7d в 6:20)
:: бэк кидаеться туда позже на неделю сначала имя full кнему неделю делаются диференцированные бэки, а через неделю он переименовываеться и отправляеться в копии и дата Имя 03.08.2019_-7d дата изменения 28.07.2019 5:30 5:30 Вс (отличие даты 6 дней)
:: Переменная пути на файл
set "sourcePath=\\172.16.14.53\Backs2\Docs\FULL_mounts\%%b.%%c.%%d_-7d.7z"
::Номер недели в месяце от 1 до 5 отсчет от ВС
for /f "Skip=1" %%e In ('WMIC Path Win32_LocalTime Get WeekInMonth') do (
if %%e == 1 (
::Если первая неделя месяца продолжить
::День недели
for /f "Skip=1" %%t In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
if %%t GEQ 5 (
:: Если 6 суббота (больше или равно 5 пятница 6 суббота)
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\172.16.14.53\Backs2\Docs\FULL_mounts\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logfullmounts14.53 -o "%%p")
:: Запрашиваем содержимое папки ищем строки с архивом оставляем 4 столбец имя арахива обрезаем по _
for /F " tokens=6,7,8 delims=_|. " %%b in ('dir \\172.16.14.53\Backs2\Docs\FULL_mounts\^|FIND /I "7z"') do (
::Дата файла больше или равно >= минус текущий день (если да выполняем скрипт дальше)
if %%d%%c%%b GEQ %yesterdas% (
:: Запрос размера файла
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k sizefullmounts14.53 -o "%%~zk")
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла меньше или равно =< от минус 7 деней
if %%l%%k%%j LEQ %yesterdayh% (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k mounts14.53 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k mounts14.53 -o 0)
)
)
)
)
)
)
)
)


:: Проверка копий по дням недели Где понедельник - 1 ,Суббота - 6 , Воскресенье - 0
:: Проверка копии в архиве на Файловом 2,3,4,5 Суббота месяца (имя архива 07.09.2019_-7d в 6:20)
:: бэк кидаеться туда позже на неделю сначала имя full кнему неделю делаются диференцированные бэки, а через неделю он переименовываеться и отправляеться в копии и дата Имя 03.08.2019_-7d дата изменения 28.07.2019 5:30 5:30 Вс (отличие даты 6 дней)
:: Переменная пути на файл
set "sourcePath=\\172.16.14.53\Backs2\Docs\%%b.%%c.%%d_-7d.7z"
::Номер недели в месяце от 1 до 5 отсчет от ВС (Skip пропуск строк в цикле которые нужно пропустить убираем WeekInMonth оставляем числовое значение)
for /f "Skip=1" %%e In ('WMIC Path Win32_LocalTime Get WeekInMonth') do (
if %%e GTR 1 (
::Если неделя месяца не первая продолжить (GTR - больше, чем)
::День недели
for /f "Skip=1" %%t In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
if %%t GEQ 5 (
:: Если 6 суббота (больше или равно 5 пятница 6 суббота)
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\172.16.14.53\Backs2\Docs\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logdocs14.53 -o "%%p")
:: Запрашиваем содержимое папки ищем строки с архивом оставляем 4 столбец имя арахива обрезаем по _
for /F " tokens=6,7,8 delims=_|. " %%b in ('dir \\172.16.14.53\Backs2\Docs\^|FIND /I "7z"') do (
::Дата файла больше или равно >= минус текущий день (если да выполняем скрипт дальше)
if %%d%%c%%b GEQ %yesterdas% (
:: Запрос размера файла
for %%k in ("%sourcePath%") do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k sizedocs14.53 -o "%%~zk")
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла меньше или равно =< от минус 7 деней
if %%l%%k%%j LEQ %yesterdayh% (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k Docs14.53 -o 1) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k Docs14.53 -o 0)
)
)
)
)
)
)
)
)

:: Удаление старых логов более 31 день
forfiles /p "%~dp0log" /S /D -31 /C "cmd /c del /f /a /q @file"
:: Создание Лога повторно запускает скрипт
::copy_bk.bat>> %~dp0log\%date%copy_bk.log|exit
Описание
Показать
Запуск скрипта ежедневно в 9:00 12:03 16:30 23:45


\\16.172.40.9\Volume\BACKFSCentr\DOM\full%date%.7z
Ежедневно в 6.26 full12.09.2019 файл на каждый день (множество файлов)
Идем в папку находим файл текущей датой сегодня (дата изменения меньше или равна сегодня) если нет ошибка если да то 1
Триггер задан нет данных за 24 ошибка и так же если значение не 1 за 24 часа ошибка

Элементы log_fullbackups , size_fullbackups , not_fullbackups


\\16.172.40.9\Volume\BACKFSCentr\ZimbraBK\*.tar.gz
перенесены на выходные(проверка в воскресенье)
архив зимбры каждый четверг или пятницу 7:50 ZimbraBK.tar 8:15 один файл
Идем в папку находим файл с раширением gz если нет ошибка , проверяем день недели если не 0 Воскресенье то завершаем , если 0 то продолжаем
скрипт файл найден проверяем то что Дата изменения файла больше или равно минус текущий день (т е проверка воскресенье дата субботы или новее должна быть изменения файла)
если нет ошибка если да то 1

Триггер задан нет данных за 7дней ошибка и так же если значение не 1 за 7 дней ошибка

Элементы logZimbraBK40.9 , sizeZimbraBK40.9 , ZimbraBK40.9



\\16.172.40.9\Volume\BACKFSCentr\Proxmox\
каждый понедельник 23:30 ProxmoxBK_2019-09-09.tar 09.09.2019 23:30
Идем в папку находим файл минус 1 день на моент проверки для сравнения т.к. проверяем утром во Вторник (а скрипт понедельник вечер)
файл найден сравниваем то что сегодня вторник. если вторник то сравниваем дату изменения файла понедельника совпало ОК 1 во всех остальных случаях 0
Имя файла минус один день подставляем Дата изменения файла больше или равно от даты сравнения минус текущий день
Триггер задан нет данных за 7дней ошибка и так же если значение не 1 за 7 дней ошибка

Элемент logProxmox40.9 , sizeProxmoxBK40.9 , ProxmoxBK40.9


Проверка каждый день ЭЛМЫ 40.93
путь на файл .bak
\\16.172.40.93\Backs2\elma_backup\elma_backup_day\ELMA_%dd_mm_yyyy%\ELMA3_backup_%denyyyy_mm_dd%_*.bak
Элементы logElmaBK40.93 , sizeElmaBK40.93 , ElmaBK40.93

путь на файл .trn
\\16.172.40.93\Backs2\elma_backup\elma_backup_day\ELMA_%dd_mm_yyyy%\ELMA3_backup_%denyyyy_mm_dd%_*.trn
Элементы sizeElmaTRN40.93 , ElmaTRN40.93

Проверка каждый день ЭЛМЫ .40.12
путь на файл .bak
\\16.172.40.12\d$\backupelma_full\elma\ELMA_%dd_mm_yyyy%\ELMA3_backup_%denyyyy_mm_dd%_*.bak
Элементы logElmaBK40.12 , sizeElmaBK40.12 , ElmaBK40.12

путь на файл .trn
\\16.172.40.12\d$\backupelma_full\elma\ELMA_%dd_mm_yyyy%\ELMA3_backup_%denyyyy_mm_dd%_*.trn
Элементы sizeElmaTRN40.12 , ElmaTRN40.12
Имя файла и папки подставляем минус один день
Дата изменения файла больше или равно минус текущий день



\\16.172.40.93\Backs2\Docs\FULL_mounts\%%b_-7d.7z
туда скидываеться архив каждую суботу начала месяца 6:20
Имя 03.08.2019_-7d дата изменения 28.07.2019 5:30 Создания 28.07.2019 5:30 Вс (отличие даты 6 дней)
бэк кидаеться туда позже на неделю сначала имя full кнему неделю делаются диференцированные бэки, а через неделю он переименовываеться и отправляеться в копии и дата
Идем в папку находим файл текущей датой на день проверки это первая суббота месяца Идем в папку находим файл с датой минус 6 дней от текущей и сравниваем если все Ок то значение 1
Проверка 1-ая неделя месяца, день пятница и суббота, ищем имя архива с датой от пятницы и новее текущей недели, Дата изменения файла меньше или равно =< от минус 7 деней
Триггер если данных нет за 36 день (так как суббота может быть 1 числом месяца 31 +5 максимальное количество ожидания),
так как данные приходят только именно в 1 субботу месяца они могут быть 1 или 0 то 2 проверка будет .last()=0

Элемент logfullmounts40.93 , sizefullmounts40.9 , mounts40.93


\\16.172.40.93\Backs2\Docs\%%a_-7d.7z
туда скидываеться архив каждую суботу 2,3,4,5 недели месяца 6:20
Имя 03.08.2019_-7d дата изменения 28.07.2019 5:30 Создания 28.07.2019 5:30 Вс (отличие даты 6 дней)
бэк кидаеться туда позже на неделю сначала имя full кнему неделю делаются диференцированные бэки, а через неделю он переименовываеться и отправляеться в копии и дата
Идем в папку находим файл текущей датой на день проверки это субботы месяца Идем в папку находим файл с датой минус 6 дней от текущей и сравниваем если все Ок то значение 1
Проверка неделя в месяце не первая, день недели 5 пятница и 6 суббота,
Дата файла архива больше или равно >= минус текущий день, Дата изменения файла меньше или равно =< от минус 7 дней

Триггер если данных нет за 14 день (так как вс может быть 1 числом месяца 7 это 1 суббота, 14 вторя неделя субботы поэтому 14 максимальное количество ожидания),
так как данные приходят только именно в 1 субботу месяца они могут быть 1 или 0 то 2 проверка будет .last()=0

Элементы logdocs40.93 , sizedocs40.93 , Docs40.93

Так же получение лога циклом содержание папки дата размер имя
Получение размера файла
Скачать
Пример скриптов.zip
Пример скриптов.zip
(7.53 КБ) 41 скачивание
Предыдущая версия
copy_bk.bat
Показать
@echo off
color 1a

:: Проверка копии в архиве каждый день (имя архива full12.09.2019.7z в 6:30)
:: Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.175.59\директория\BACKFS\DOM\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k log_fullbackups -o "%%p")
:: Запрос содержание данной директории в текстовом формате
for %%k in (\\192.168.175.59\директория\BACKFS\DOM\full%date%.7z) do set sizefull=%%~zk
:: Переменная пути на файл
set "sourcePath=\\192.168.175.59\директория\BACKFS\DOM\full%date%.7z"
:: Переменная если файл не найден ошибка
set good=0
::Текущая дата дд.мм.гггг
set needDate=%date%
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
if %%j.%%k.%%l == %needDate% (
:: Если файл найден то good=1
set good=1
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_fullbackups -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k size_fullbackups -o %sizefull%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k not_fullbackups -o 0)


:: Проверка копий по дням недели Где понедельник - 1 ,Суббота - 6 , Воскресенье - 0
:: Проверка копии в архиве на Файловом Четверг (имя архива ZimbraBK.tar в 8:20)
:: Переменная пути на файл
set "sourcePath=\\192.168.175.59\директория\BACKFS\ZimbraBK\*.gz"
:: Переменная если файл не найден, не совпала дата изменения с текущей или не первый четверг в месяце то ошибка
set good=0
::День недели
for /f "Skip=1" %%d In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
if %%d == 4 (
:: Если 4 Четрверг
:: Запрос содержание данной директории в текстовом формате
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.175.59\директория\BACKFS\ZimbraBK\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logZimbraBK175.59 -o "%%p")
:: Запрос размера файла
for %%k in (\\192.168.175.59\директория\BACKFS\ZimbraBK\*.gz) do set sizeZimbraBK=%%~zk
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
if %%j.%%k.%%l == %Date% (
set good=1
)
)
)
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k ZimbraBK175.59 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k sizeZimbraBK175.59 -o %sizeZimbraBK%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k ZimbraBK175.59 -o 0)


:: Проверка копий по дням недели Где понедельник - 1 ,Суббота - 6 , Воскресенье - 0
:: Проверка копии архива Понедельник проверяем утро Вторник (имя архива ProxmoxBK_2019-09-09.tar в 23:30)
:: Переменная если файл не найден, не совпала дата изменения с текущей или не понедельник то ошибка
set good=0
:: Скрипт минус 1 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%
:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Цифра месяца соответствует порядковому номеру в скобках
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set yesterday=%d:~-2%.%m:~-2%.%y%
set ryesterday=%y%-%m:~-2%-%d:~-2%
::Конец скрипта минус 1 день
setlocal DISABLEDELAYEDEXPANSION
:: Переменная пути на файл
set "sourcePath=\\192.168.175.59\директория\BACKFS\Proxmox\ProxmoxBK_%ryesterday%.tar.gz"
::День недели
for /f "Skip=1" %%d In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
if %%d == 2 (
::Если 2 вторник
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.175.59\директория\BACKFS\Proxmox') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logProxmox175.59 -o "%%p")
:: Запрос размера файла
for %%k in (\\192.168.175.59\директория\BACKFS\Proxmox\ProxmoxBK_%ryesterday%.tar.gz) do set sizeProxmoxBK=%%~zk
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
if %%j.%%k.%%l == %yesterday% (
set good=1
)
)
)
)
)
)
:: Сюда попадает ответ переменной good 0 или 1 для сравнения
if %good% == 1 (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k ProxmoxBK175.59 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k sizeProxmoxBK175.59 -o %sizeProxmoxBK%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k ProxmoxBK175.59 -o 0)

:: Скрипт минус 6 день
setlocal enabledelayedexpansion
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%
:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Определение кл-ва дней в феврале высокосный год или нет от 0 до 3
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Минус 1 месяц
set /a tok=m-1
::Проверка января если месяц 1 -1=0 значит месяц 12
if %tok%==0 set tok=12
::Цифра месяца соответствует порядковому номеру в скобках
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
:: минус 6 день set /a d-=6
set /a d-=6
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set yesterday=%d:~-2%.%m:~-2%.%y%
::Конец скрипта минус 6 день
setlocal DISABLEDELAYEDEXPANSION

:: Проверка копий по дням недели Где понедельник - 1 ,Суббота - 6 , Воскресенье - 0
:: Проверка копии в архиве на Файловом первая Суббота месяца (имя архива 07.09.2019_-7d в 6:20)
:: бэк кидаеться туда позже на неделю сначала имя full кнему неделю делаются диференцированные бэки, а через неделю он переименовываеться и отправляеться в копии и дата Имя 03.08.2019_-7d дата изменения 28.07.2019 5:30 5:30 Вс (отличие даты 6 дней)
:: Переменная пути на файл
set "sourcePath=\\192.168.175.59\директория\BACKFS\Docs\FULL_mounts\%date%_-7d.7z"
:: Переменная если файл не найден, не совпала дата изменения с текущей или не суббота то ошибка
set good=0
::Номер недели в месяце от 1 до 5 отсчет от ВС
for /f "Skip=1" %%e In ('WMIC Path Win32_LocalTime Get WeekInMonth') do (
if %%e == 1 (
::Если первая неделя месяца продолжить
::День недели
for /f "Skip=1" %%d In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
if %%d == 6 (
:: Если 6 суббота
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.175.59\директория\BACKFS\Docs\FULL_mounts\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logfullmounts175.59 -o "%%p")
:: Запрос размера файла
for %%k in (\\192.168.175.59\директория\BACKFS\Docs\FULL_mounts\%date%_-7d.7z) do set fullmounts=%%~zk
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
if %%j.%%k.%%l == %yesterday% (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k mounts175.59 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k sizefullmounts175.59 -o %fullmounts%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k mounts175.59 -o 0)
)
)
)
)
)
)
)
)


:: Проверка копий по дням недели Где понедельник - 1 ,Суббота - 6 , Воскресенье - 0
:: Проверка копии в архиве на Файловом 2,3,4,5 Суббота месяца (имя архива 07.09.2019_-7d в 6:20)
:: бэк кидаеться туда позже на неделю сначала имя full кнему неделю делаются диференцированные бэки, а через неделю он переименовываеться и отправляеться в копии и дата Имя 03.08.2019_-7d дата изменения 28.07.2019 5:30 5:30 Вс (отличие даты 6 дней)
:: Переменная пути на файл
set "sourcePath=\\192.168.175.59\директория\BACKFS\Docs\%date%_-7d.7z"
:: Переменная если файл не найден, не совпала дата изменения с текущей или не суббота то ошибка
set good=0
::Номер недели в месяце от 1 до 5 отсчет от ВС (Skip пропуск строк в цикле которые нужно пропустить убираем WeekInMonth оставляем числовое значение)
for /f "Skip=1" %%e In ('WMIC Path Win32_LocalTime Get WeekInMonth') do (
if %%e GTR 1 (
::Если неделя месяца не первая продолжить (GTR - больше, чем)
::День недели
for /f "Skip=1" %%d In ('WMIC Path Win32_LocalTime Get DayOfWeek') do (
if %%d == 6 (
:: Если 6 суббота
::Запрос содержание данной директории в текстовом формате циклом для каждого файла
for /f "Skip=5 eol= delims=" %%p in ('dir \\192.168.175.59\директория\BACKFS\Docs\') do (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k logdocs175.59 -o "%%p")
:: Запрос размера файла
for %%k in (\\192.168.175.59\директория\BACKFS\Docs\%date%_-7d.7z) do set docs=%%~zk
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
if %%j.%%k.%%l == %yesterday% (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k Docs175.59 -o 1 & zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k sizedocs175.59 -o %docs%) else (zabbix_sender.exe -z 192.168.175.111 -p 10051 -s FILESERVER1 -k Docs175.59 -o 0)
)
)
)
)
)
)
)
)
Скрипт в архиве
copy_bk.zip
copy_bk.zip
(2.47 КБ) 38 скачиваний
Выполняется повторно скрипт, но команды уже не отображаются, а пишутся в лог для 2 запуска
Если добавить в скрипт
::Для удаления старых логов
forfiles /p "%~dp0log" /S /D -5 /C "cmd /c del /f /a /q @file"
::Для вывода лога из скрипта добавить команду
copy_bk.bat>> %~dp0log\%date%copy_bk.log|exit

Для цикла с отдельной процедурой
Продолжения цикла 228 это последний IP в цикле
:: Создание Лога
IF %1==228 call:log
goto:pusto
:log
check_bk_fs.bat>> %~dp0log\%date%check_bk_fs.log|goto:eof
:pusto

Запустить один раз, и записать лог Прописывается в команде запуска например в планировщике заданий
По сути визуальный вывод перенаправить в лог
Путь запуска батника и после батника указываем вывод в лог
Путь\ИмяФайла.bat>Путь\ИмяЛогФайла.txt
D:\Документы\Desktop\1.bat>>D:\Документы\Desktop\log\%date%copy_bk.log

Пример
Аргумент >>D:\Документы\Desktop\log\%date%copy_bk.log
Планировщик заданий вывод лога аргумент
Планировщик заданий вывод лога аргумент
Так же можно добавить вывод времени
В начало скрипта время начало выполнения
echo Start %time%
В конец скрипта время время завершения выполнения
echo Stop %time%

> - заменить данные лога
>> - Дополнить данные лога
1 - все норм 1>>
2 - ошибки 2>>
Описание команд удаления и логов
Показать
forfiles /p "%~dp0log" /S /D -5 /C "cmd /c del /f /a /q @file"
Команда FORFILES является удобным средством выполнения заданных команд для группы файлов в пакетных заданиях.
FORFILES - отобразить список файлов текущего каталога.
/P < путь > - Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.).
путь до папка с логами "%~dp0log"
/C < команда > - Команда, которая выполняется для каждого файла. Строки команд необходимо заключать в прямые кавычки.
/D < дата > - Выбор файлов, у которых дата последнего изменения больше или равна (+) либо меньше или равна (-) указанной дате при использовании формата "dd.MM.yyyy"; либо файлов, у которых дата последнего изменения больше или равна (+) текущей дате плюс "dd" дней либо меньше или равна (-) текущей дате минус "dd" дней. Допустимым числом дней "dd" является любое число в диапазоне 0 - 32768. "+" используется по умолчанию, если знак не указан.
Перед внутренними командами CMD.exe необходимо ставить "cmd /c"
DEL (ERASE) используется для удаления одного или нескольких файлов
/F - Принудительное удаление файлов, доступных только для чтения.
/A - Отбор файлов для удаления по атрибутам
/Q - Отключение запроса на подтверждение при удалении файлов.
@file - возвращает имя файла.

copy_bk.bat>> %~dp0log\%date%copy_bk.log|exit
Имя скрипта.bat
>> Вывести Дописать лог
%~dp0 путь откуда запущен скрипт папка log рядом со скриптом %date%copy_bk.log -текущая дата copy_bk.log
|exit - чтобы цикл не уходил в цикличность закрытие выход из скрипта

Источники
Список команд Windows ( Windows CMD ) с описанием и примерами.
О команде forfiles
О команде del
количество слов: 3605
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Скрипты резервного копирования и Проверка копий

Сообщение Артём Мамзиков »

Изменения в скриптах размер увеличился для архивов, архивы формируется дольше и в текущую дату сравнения не попадает == значит делаем либо текущая дата изменения которая нам интересна или новее то все гуд. если дата старая то архив старый не сформировался. Можно еще в имя файла сделать дату начала формирования архива и сравнивать ее на наличие нового архива но это еще архивы формирования и удаления копий нужно переделывать.

Тестовые пробы отдельных частей скрипта!
:: Переменная пути на файл
set "sourcePath=D:\Документ.doc"
:: Переменная если файл не найден, не совпала дата изменения с текущей или не суббота то ошибка
set good=0
:: Выполнить цикл на проверку файла переход в директорию проверка строки имени файлов сранение дат изменения
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
::Дата изменения файла больше или равно текущий день или новее
if %%l%%k%%j GEQ 20200202 (echo 1) else (echo 2)
)
)
::Формируем дату для сравнение одним занчением yyyymmdd
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

set yyyymmdd=%y%%m%%d%
echo %yyyymmdd%


::Получам дату создания файла
set "sourcePath=D:\Документ.doc"
for /f "Skip=5 tokens=1 eol= delims=" %%a in ('dir /-c /tc %sourcePath%') do set creationdate=%%a
::Формируем дату для сравнение одним занчением yyyymmdd
::День
set d=%creationdate:~0,2%
::Месяц
set m=%creationdate:~3,2%
::Год
set y=%creationdate:~6,4%
set yyyymmdd=%y%%m%%d%
echo %yyyymmdd%


::Формируем дату для сравнение одним занчением yyyymmdd
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

set yyyymmdd=%y%%m%%d%

for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
:: if %%j.%%k.%%l == %needDate% (
::Дата изменения файла больше или равно текущий день или новее
if %%l%%k%%j GEQ %yyyymmdd% (



pause

::Другие варианты исполнения команд
:: Проверка dir D:\документ.doc
::FOR /f "Skip=4 usebackq tokens=1,2,3,* delims= " %%a IN (`dir "%sourcePath%"`) DO ECHO %%a
:: FOR /f "usebackq tokens=1,2,3,* delims= " %%a IN (`dir /-c /tc "%%f"`) DO IF "%%d" == "%%~nf%%~xf" ECHO %%a >> "%~2"
количество слов: 191
Ответить Вложения 9 Пред. темаСлед. тема

Вернуться в «Файлы и Папки»