1 (изменено: Balux, 2016-03-30 21:36:37)

Тема: AHK: Создавать копию файлов, при закрытии exe программы

Здравствуйте, использую систему в режиме тени, т.е. при отключении ПК, все данные пропадают. Хотелось бы делать частый авто-бэкап некоторых файлов, подскажите пожалуйста, возможно ли это сделать?

При закрытии, например, firefox.exe, нужно скопировать определённые файлы из папки вроде: C:\KKK\Box\drive\Profile\*****, где ***** это название папки, которое часто изменяется, но т.к. она одна, нужно просто переходить в следующую директорию. В папку с автоименованием даты/времени D:\KKK\Box\drive\Profile\2016-03-28_23-35-05.

Как я себе это представляю:


Программы, на которые срабатывает скрипт:
prog:="mpc-be64.exe"
prog:="mpc-be.exe"
prog:="firefox.exe"

Адреса копируемых файлов:
C:\KKK\Box\drive\Profile\*****\file1.exe
C:\KKK\Box\drive\Profile\*****\file2.sqlite
C:\KKK\Bkfdsa\yhkuyg\yuinv\8ojgfc\file1.txt
C:\KKK\UHfcc\hl8gf\6jkbik\ohgrg\file2.doc

Директория для копий:
D:\KKK\Box\drive\Profile\<Date_Time>

code...
code...
code...

2

Re: AHK: Создавать копию файлов, при закрытии exe программы

Loop (файлы и папки)
FileCopy
FileCopyDir

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3

Re: AHK: Создавать копию файлов, при закрытии exe программы

Alectric
Спасибо за ссылки, прочитал, но ничего особо не понял. К сожалению, не понимаю как сделать готовый скрипт-программу, чтобы он следил за закрытием нескольких exe, да ещё, для каждого exe копировал разные файлы, проверяя дату изменения копируемого файла или папки, дабы не плодить десятки одинаковых, т.к. к примеру, использую несколько портативных Firefox-ов и MPC-BE.

Вот примерно как хотелось бы добавлять задачи в начало скрипта. Если у кого-нибудь будет свободное время и желание помочь.

Program1:="firefox.exe"
Copy1:="C:\Users\AERIE\AppData\Roaming\Mozilla\Firefox\Profiles\default\prefs.js"
Backup1:="D:\Backup\Firefox\<date yyyy-mm-dd_hh-nn-ss>"

Program2:="foobar2000.exe"
Copy2:="C:\Users\AERIE\AppData\Roaming\foobar2000\configuration"
Backup2:="D:\Backup\foobar2000\<date yyyy-mm-dd_hh-nn-ss>"

Program3:="mpc-be64.exe"
Copy3:="C:\Users\AERIE\AppData\Roaming\MPC-BE\mpc-be64.ini"
Backup3:="D:\Backup\MPC-BE\<date yyyy-mm-dd_hh-nn-ss>"

4

Re: AHK: Создавать копию файлов, при закрытии exe программы

#Persistent
global ProcessArray := [ {process: "mpc-be64.exe", func: "MpcBe64"}
							  , {process: "mpc-be.exe", func: "MpcBe"}
							  , {process: "firefox.exe", func: "firefox"} ]

oSvc := ComObjGet("winmgmts:")
ComObjConnect(deleteSink := ComObjCreate("WbemScripting.SWbemSink"), "ProcessDelete_")

Command := "Within 1 Where TargetInstance ISA 'Win32_Process'"
oSvc.ExecNotificationQueryAsync(deleteSink, "select * from __InstanceDeletionEvent " Command)

ProcessDelete_OnObjectReady(obj)
{
	Process := obj.TargetInstance
	for k, v in ProcessArray
		if (v.process = Process.Name && MyFunc := v.func)
			break
	(MyFunc && %MyFunc%())
}

MpcBe64()
{
	MsgBox, mpc-be64.exe завершён
}

MpcBe()
{
	MsgBox, mpc-be.exe завершён
}

firefox()
{
	MsgBox, firefox завершён
}

Вместо MsgBox в каждой функции нужные действия.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Создавать копию файлов, при закрытии exe программы

teadrinker
Спасибо огромное, сам бы я до такого не додумался. Уже что-то получилось, я взял код из примера уважаемого Alectric, но не подскажете как вставить несколько CopySourcePattern для разных файлов? Вот так работает только на второй файл, а через запятую только на первый. И может быть знаете, как каждый раз копировать файлы в новую папку с именем текущей даты и времени yyyy-mm-dd_hh-nn-ss?

firefox()
{
CopySourcePattern := "C:\Users\AERIE\AppData\Roaming\Mozilla\Firefox\Profiles\default\places.sqlite"
CopySourcePattern := "C:\Users\AERIE\AppData\Roaming\Mozilla\Firefox\Profiles\default\prefs.js"
CopyDest := "D:\Backup\Firefox"
Loop, %CopySourcePattern%
{
    copy_it = n
    IfNotExist, %CopyDest%\%A_LoopFileName% ; Всегда копировать, если одноимённый файл не существует.
        copy_it = y
    else
    {
        FileGetTime, time, %CopyDest%\%A_LoopFileName%
        EnvSub, time, %A_LoopFileTimeModified%, seconds ; Вычесть время файла-источника из времени файла-приёмника.
        if time < 0 ; Файл-источник новее, чем файл-приёмник.
            copy_it = y
    }
    if copy_it = y
    {
        FileCopy, %A_LoopFileFullPath%, %CopyDest%\%A_LoopFileName%, 1 ; Перезапись при копировании разрешена.
        if ErrorLevel
            MsgBox, Не удалось скопировать "%A_LoopFileFullPath%" в "%CopyDest%\%A_LoopFileName%".
    }
}
Return 
}

6

Re: AHK: Создавать копию файлов, при закрытии exe программы

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

firefox()

firefox()
{
	FilesForCopy =
	(LTrim
	C:\Users\AERIE\AppData\Roaming\Mozilla\Firefox\Profiles\default\places.sqlite
	C:\Users\AERIE\AppData\Roaming\Mozilla\Firefox\Profiles\default\prefs.js
	)
	Loop, parse, FilesForCopy, `n, `r
	{
		;здесь действия с каждым отдельным файлом
		MsgBox, % A_LoopField  ; путь к каждому отдельному файлу в переменной A_LoopField
	}
}

В остальном уточните задачу.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: Balux, 2016-04-07 10:10:10)

Re: AHK: Создавать копию файлов, при закрытии exe программы

teadrinker
К сожалению, не могу понять, как совместить Ваш код с кодом из предыдущего сообщения, это возможно или здесь только простые команды копирования?

В остальном уточните задачу.

Имелось ввиду, чтобы при каждом копировании, создавалась новая папка с текущей датой 2016-04-07_10-09-32 и уже в неё помещалось копируемое, это было бы удобно, при копировании целых папок с файлами.

8

Re: AHK: Создавать копию файлов, при закрытии exe программы

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

Можно ли совместить всё это в одном скрипте? Т.к. некоторые файлы изменяются только после закрытия программы, то оба способа пригодятся.

И сделать удобное заполнение, как в примере, с ключевыми словами (Program1, Copy1, Backup1, Time1), а если поле Time1 не указано, то копирование происходит при закрытии программы. Плюс глобальная горячая клавиша, копирующая сразу все файлы, указанные в коде.

Program1:="firefox.exe"
Copy1:="C:\Mozilla\Firefox\Profiles\default\places.sqlite", "C:\Mozilla\Firefox\Profiles\default\prefs.js"
Backup1:="D:\Backup\Firefox"
Time1: 300 ; Секунды

9

Re: AHK: Создавать копию файлов, при закрытии exe программы

Всё ещё лелею надежду на помощь.

10

Re: AHK: Создавать копию файлов, при закрытии exe программы

Balux, попробуйте так:

#Persistent
Process1 := "firefox.exe"
; в Copy только файлы!
Copy1 = 
(
C:\Mozilla\Firefox\Profiles\default\places.sqlite
C:\Mozilla\Firefox\Profiles\default\prefs.js
)
Backup1 := "D:\Backup\Firefox"
Time1 := 300  ; секунды

Data := {}
while proc := Process%A_Index%  {
	i := A_Index
	obj := Data[proc] := {}
	for k, v in ["Copy", "Backup", "Time"]  {
		var := v . i
		if (%var% = "" && v != "Time")  {
			MsgBox, % "Переменная " var " не определена, присвойте значение!"
			ExitApp
		}
		obj[v] := %var%
	}
}
MyBackup := new Backup(Data)
Return

class Backup
{
	__New(data)  {
		this.data := data
		watch := this.WatchProcesses.Bind(this)
		SetTimer, % watch, 1000
	}
	WatchProcesses()  {
		for proc in this.data  {
			Process, Exist, % proc
			this.DefineAction(proc, ErrorLevel)
		}
	}
	DefineAction(proc, exist)  {
		obj := this.data[proc]
		obj.exist := exist
		if (obj.exist && !obj.exist_prev && obj.time)  {
			timer := obj.timer := this.Backups.Bind(this, obj)
			SetTimer, % timer, % (obj.time)*1000
			this.Backups(obj)
		}
		if (!obj.exist && obj.exist_prev)  {
			if (timer := obj.timer)  {
				SetTimer, % timer, Delete
				obj.timer := ""
			}
			this.Backups(obj)
		}
		obj.exist_prev := obj.exist
	}
	Backups(obj)  {
		Critical
		CoordMode, ToolTip
		dir := obj.Backup
		if !FileExist(dir)  {
			FileCreateDir, % dir
			if ErrorLevel  {
				MsgBox, % "Не удалось создать папку " dir "!`nОшибка " A_LastError
				ExitApp
			}
		}
		files := obj.Copy
		Loop, parse, files, `n, `r
		{
			if !FileExist(A_LoopField)  {
				NonExistFiles .= "`n" A_LoopField
				continue
			}
			SplitPath, A_LoopField, FileName
			if FileExist(file := dir "\" FileName)  {
				FileGetTime, CopyLastModified, % file
				FileGetTime, SourceLastModified, % A_LoopField
			}
			if !FileExist(file) || (SourceLastModified > CopyLastModified)  {
				FileCopy, % A_LoopField, % file, 1
				if ErrorLevel
					NotCopied .= "`n" A_LoopField
			}
		}
		if !NonExistFiles
			ToolTip,,,, 1
		else  {
			ToolTip, % "При попытке копирования не обнаружены файлы:`n" NonExistFiles, 1, 1, 1
			Sleep, 1000
		}
		if !NotCopied
			ToolTip,,,, 2
		else  {
			ToolTip, % "Не удалось скопировать файлы:`n" NotCopied, 500, 1, 2
			Sleep, 1000
		}
		Critical, Off
	}
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Создавать копию файлов, при закрытии exe программы

teadrinker
Крайне Вам признателен, плотно потестировал, всё работает превосходно, можно не беспокоиться о файлах.

Теперь уже постоянно использую 11 скриптов, качественно улучшающих свойства системы, благодаря Вам и другим участникам script-coding, а без них и Шиндовс не мил.