1 (изменено: sabir.yanin2014, 2016-05-02 23:21:05)

Тема: AHK: Создание резервных копий

Чтобы защитить важные документы от возможной утраты логично создать обновляемую резервную копию этих документов. Хотя таких программ очень много,  я решил написать собственную. Утилита работает следующим образом: 1)при  запуске,   появляется диалоговое окно с предложением выбрать файл для резервного копирования; 2) Появляется окно выбора папки где мы будем сохранять резервные копии; 3) Появится сообщение,в котором будет сказано что резервная копия будет создана после перезагрузки компьютера


if (A_TickCount>60000) ; позднее одной минуты с момента запуска компьютера
{
t1=-----------------------------------------------Выберите файл
t2=для резервного копирования--------------------------
FileSelectFile, FileDir, , ,%t1% %t2% 
if FileDir=
Return 
FileSelectFolder, RezervCopy,  ,  , Выберите папку для сохранения копий
if RezervCopy=
return
t3=Резервное копирование:`n"%FileDir%"
t4=`n                в папку:`n"%RezervCopy%"
t5=`nбудет выполнено после `nперезагрузки компьютера
MsgBox %t3%%t4%%t5%
Rec=FileCopy, %FileDir%, %RezervCopy%, 1
FileAppend, `n%Rec%, %A_ScriptFullPath%
Return 
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Скрипт обновится:


if (A_TickCount>60000)  ; позднее одной минуты с момента запуска компьютера
{
t1=-----------------------------------------------Выберите файл
t2=для резервного копирования--------------------------
FileSelectFile, FileDir, , ,%t1% %t2% 
if FileDir=
Return 
FileSelectFolder, RezervCopy,  ,  , Выберите папку для сохранения копий
if RezervCopy=
return
t3=Резервное копирование:`n"%FileDir%"
t4=`n                в папку:`n"%RezervCopy%"
t5=`nбудет выполнено после `nперезагрузки компьютера
MsgBox %t3%%t4%%t5%
Rec=FileCopy, %FileDir%, %RezervCopy%, 1
FileAppend, `n%Rec%, %A_ScriptFullPath%
Return 
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;менее одной минуты с момента запуска компьютера 
FileCopy, C:\My File.txt, D:\, 1
FileCopy, C:\Games\Fallout 4\Fallout4.exe, C:\Users\Андрей\Desktop\N2, 1
FileCopy, D:\программы\автохоткей\автохоткей.docx, C:\Users\Андрей\YandexDisk\автохоткей, 1

*Ниже черты появилось три директории. Данные записи можно удалять вручную.

Теперь осталось добавить данный скрипт в автозагрузку. Как это сделать можно посмотреть
вот здесь. После загрузки компьютера скрипт выполнит копирование, файлы будут перезаписаны.
Если исходного файла нет(был случайно удален)  ничего не происходит. Резервный файл остается на старом месте. Цель достигнута.

2 (изменено: sabir.yanin2014, 2016-04-19 23:05:01)

Re: AHK: Создание резервных копий

С вопросом разобрался. А удалять сообщения как то можно?

3

Re: AHK: Создание резервных копий

sabir.yanin2014, напишите решение. Зачем удалять?

4

Re: AHK: Создание резервных копий

Нет ли на примете скрипта, синхронизирующего содержимое двух папок по содержанию первой (исходной)? То есть, когда вторая отражает все изменения, происходящие в первой?

5 (изменено: sabir.yanin2014, 2016-05-02 23:02:30)

Re: AHK: Создание резервных копий

Добавлена возможность резервного копирования папок:


if (A_TickCount>120000)
{
InputBox, tip, Выберите тип объекта(файл`,папка),
(
Копию чего вы хотите настроить?`nфайла-введите "1"
папки-введите  "2"
)
	if tip=1
	{
	t1=-----------------------------------------------Выберите файл
	t2=для резервного копирования--------------------------
	FileSelectFile, FileDir, , ,%t1% %t2% 
	if FileDir=
	Return 
	FileSelectFolder, RezervCopy,  ,  , Выберите папку для сохранения копий
	if RezervCopy=
	return
	t3=Резервное копирование:`n"%FileDir%"
	t4=`n                в папку:`n"%RezervCopy%"
	t5=`nбудет выполнено после `nперезагрузки компьютера
	MsgBox %t3%%t4%%t5%
	Rec=FileCopy, %FileDir%, %RezervCopy%, 1
	FileAppend, `n%Rec%, %A_ScriptFullPath%
	}
	else if tip=2
	{
	t1=   Выберите папку
	t2=для резервного копирования
	FileSelectFolder, FileDir, , ,%t1% %t2% 
	if FileDir=
	Return 
	FileSelectFolder, RezervCopy,  ,  , Выберите папку для сохранения копий
	if RezervCopy=
	return
	t3=Резервное копирование:`n"%FileDir%"
	t4=`n                в папку:`n"%RezervCopy%"
	t5=`nбудет выполнено после `nперезагрузки компьютера
	MsgBox %t3%%t4%%t5%
	SplitPath, FileDir, FolderName
	; Извлечь из полного пути только имя папки.
	Rec=FileCopyDir, %FileDir%, %RezervCopy%\%FolderName%, 1
	FileAppend, `n%Rec%, %A_ScriptFullPath%
	}
	Return 
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

6

Re: AHK: Создание резервных копий

sabir.yanin2014, скрипт резервно копирует при каждой перезагрузке ПК? На мой взгляд, было бы логичнее, если это происходило после изменения синхронизируемого файла или дополнения файлами синхронизируемой директории. Если такое возможно, конечно.

7

Re: AHK: Создание резервных копий

becauseim
Присоединяюсь, было бы отлично иметь такой скрипт для бэкапа, плюс возможность установки таймера (каждые 5 минут), для постоянно изменяющихся файлов.

8 (изменено: sabir.yanin2014, 2016-05-25 20:53:20)

Re: AHK: Создание резервных копий

Данный скрипт каждые 15 мин проверяет наличие изменений размеров исходного объекта относительно резервной копии и если размеры не совпадают переписывает копию. Особенности скрипта:
-Добавляем запись -Ctrl+S;
-Выполнить экстренную проверку-Ctrl+R;
-Можно настроить резервное копирование как файла так и папки;
-Выбор метода сохранения(1-через каждые пятнадцать минут при наличии изменений (по умолчанию),
2-(принудительный) каждые 15 мин);
-При выполнении копирования раздается звуковой сигнал
и выскакивает информационное окно (если не нужно-удалить строки MsgBox);

MsgBox %A%`n%A_Size%`n%B%`n%B_Size%

-Новые записи будут добавлены в низ скрипта. Удалять сценарии можно вручную-
внизу скрипта находим нужную строку и удаляем;


s2:
№:=1,tip1_1:=1,tip2_1:=1,A1:="D:\Программы\AHK\автохоткей.docx",B1:="C:\Users\sabir\OneDrive\Документы"
№:=2,tip1_2:=1,tip2_2:=1,A2:="D:\Программы\AHK\автохоткей.docx",B2:="C:\YandexDisk\автохоткей"
№:=3,tip1_3:=2,tip2_3:=1,A3:="D:\Программы\AHK\скрипты",B3:="C:\Users\sabir\OneDrive\Документы"
№:=4,tip1_4:=2,tip2_4:=1,A4:="D:\Программы\AHK\скрипты",B4:="C:\YandexDisk\автохоткей"
№:=5,tip1_5:=2,tip2_5:=1,A5:="D:\Программы\Програмирование",B5:="C:\Users\sabir\OneDrive\Документы"
№:=6,tip1_6:=2,tip2_6:=1,A6:="D:\Программы\Програмирование",B6:="C:\YandexDisk"
Return

Код:


#SingleInstance force
SetBatchLines, -1
SetTimer, s1, 900000 ;проверка изменений в файлах(папках) каждые 15 мин.
s1: 
Gosub, s2
loop, %№%
{
	A:=A%A_Index%,B:=B%A_Index%
	if (A="" or B="") ;если задачи были удалены(переменные не существуют)
	continue ;прокрутка цикла вперед на №+1
	SplitPath, A, A_Name
	if (tip1_%A_Index%=1) ;если копируем файл
	{
		FileGetSize, A_Size, %A%  ; Размер в байтах
		FileGetSize, B_Size, %B%\%A_Name%  ; Размер в байтах
		if (A_Size=B_Size)
		res:=false
		else
		res:=true ;если размеры не совпадают-копирование
		IfNotExist, %A%
		MsgBox, Исходный файл не существует!`n%A%???
		else if (res or tip2_%A_Index%=2)
		{
		SoundBeep ;сигнал-идет копирование
		MsgBox %A%`n%A_Size%`n%B%`n%B_Size%
		FileCopy, %A%, %B%, 1
		}
	}
	else if (tip1_%A_Index%=2) ;если копируем папку
	{
		A_Size:=0
		Loop, %A%\*.*, , 1
		A_Size+=%A_LoopFileSize%
		B_Size:=0
		Loop, %B%\%A_Name%\*.*, , 1
		B_Size+=%A_LoopFileSize%
		if (A_Size=B_Size)
		res:=false
		else
		res:=true ;если размеры не совпадают-копирование
		IfNotExist, %A%
		MsgBox, Исходная папка не существует!`n%A%???
		else if (res or tip2_%A_Index%=2)
		{
		SoundBeep ;сигнал-идет копирование
		MsgBox %A%`n%A_Size%`n%B%`n%B_Size%
		FileRemoveDir, %B%\%A_Name%, 1 ;предварительно удаляем папку
		FileCopyDir, %A%, %B%\%A_Name%, 1 ;копируем папку
		}
	}
}
Return 
  
^vk53:: ;Ctrl+S-новая запись
№:=0 
InputBox, tip1, Выберите тип объекта(файл`,папка),
(
Копию чего вы хотите настроить?`nфайла-введите "1"
папки-введите  "2"
)
if tip1=1
{
t1=--------------------------------Выберите файл(оригинал)
t2=для резервного копирования--------------------------
FileSelectFile, A, , ,%t1% %t2% 
if A=
Return 
FileSelectFolder, B,  ,  , Выберите папку для сохранения копий
if B=
Return 
}
else if tip1=2
{
t1=   Выберите папку(оригинал)
t2=для резервного копирования
FileSelectFolder, A, , ,%t1% %t2% 
if A=
Return 
FileSelectFolder, B,  ,  , Выберите папку для сохранения копий
if B=
Return  
}
else
Return

InputBox, tip2, Настройте алгоритм сохранения,
(
Выберите критерий сохранения:`n`nчерез каждые 15мин при изменении размера
объекта(по умолчанию)-введите  "1"
через каждые 15мин-введите "2"
)
if (tip2!=2)
tip2:=1
 
Loop, read, %A_ScriptFullPath%
SumStr:=A_Index ;определяем общее количество строк данного скрипта
ScriptName:=SubStr(A_ScriptName, 1, InStr(A_ScriptName, ".") -1) 
;определяем имя скрипта без расширения
Loop, read, %A_ScriptFullPath%, %A_WorkingDir%\%ScriptName%.txt
{
if (A_Index=SumStr)
break
FileAppend, %A_LoopReadLine%`n
}
Gosub, s2 
№+=1 ;порядковый номер новой задачи
Rec=
(
№:=%№%,tip1_%№%:=%tip1%,tip2_%№%:=%tip2%,A%№%:="%A%",B%№%:="%B%"
Return 
)
FileAppend, %Rec%, %A_WorkingDir%\%ScriptName%.txt
FileDelete, %A_ScriptFullPath%
FileMove, %A_WorkingDir%\%ScriptName%.txt, %A_WorkingDir%\%ScriptName%.ahk
Reload

^vk52:: ;Ctrl+R выполнить экстренную проверку
Gosub, s1 
Return
 
s2:
Return