1 (изменено: Bulef, 2020-06-14 19:12:45)

Тема: AHK: Script Saver

Создал для себя скрипт для создания других скриптов. Работает он с помощью информации о местоположении и названии скрипта, помещаемого в тело самого скрипта. Примером является сам скрипт. Все действия, происходят относительно местоположения основного скрипта. Есть функции логирования версий, логирования копирований, перемещения и функция переименования скриптов. Иконка скрипта в прикреплении. Делался скрипт, с оглядкой на Notepad++.

; AHK Script Saver
; Версия 1.08 Notepad++
; \AHK Script Saver

/*


Alt + X => Закрыть этот скрипт.

Alt + 1 => Создать скрипт, исходя из блока информации о скрипте. Вы можете прервать операцию копирования, нажав Alt + 1 повторно.

-----

Скрипт создан для использования с Notepad++.

Для Notepad++, рекомендуется отключить функцию "Отслеживание Изменений в Файлах", так как функцию обновления скриптов, выполняет текущий скрипт.

Вкладка "Опции" => Вкладка "Настройки" => Вкладка "Разное" => Опция "Отслеживание Изменений в Файлах" => Пункт "Отключено"

-----


; Это сноска.

Если хотите указать информацию о скрипте, используйте такой формат типа строки.

-----

Первая строка в виде сноски, определяет имя скрипта.

Формат: "; Имя скрипта".

-----

Остальные строки несущие информацию о скрипте, должны идти в одном блоке со сноской (подряд), в которой указано имя скрипта. Любые другие строки информации, кроме имени скрипта, являются необязательными. Порядок необязательных строк, может быть абсолютно любым.

Последняя строчка информации о скрипте, должна отделяться переносом строки от всего остального скрипта. В противном случае, поиск будет осуществляться по всем строкам находящимся в одном блоке. Это не приведёт к ошибкам, но снизит скорость поиска и обработки скриптом строк.

-----

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

Формат: "; Версия 1", или может быть например таким: "; Версия Тестовая 112.50153 Б".

-----

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

Формат: "; \Название папки", или может быть например таким: "; \Название папки\Название подпапки\Название подпапки №2".

-----

В любой другой сноске подряд, но только после сноски с именем, может быть указан способ создания для скрипта. Вы можете отключить функцию перемещения. Это позволит проигнорировать совпадения имени скриптов и запретить появление вопроса о перемещении файлов скрипта - источника, из его папки, в папку, к скрипту - приемнику.

Формат: "; Копировать".

-----

В любой другой сноске подряд, но только после сноски с именем, может быть указано новое имя файла скрипта, если Вы хотите переименовать скрипт. Имя конечной папки, никак не зависит от имени самого скрипта. Не забывайте изменить информацию о скрипте на актуальную после переименования.

Формат: "; Переименовать в Имя скрипта".

-----

В любой другой сноске подряд, но только после сноски с именем, может быть указана команда на удаление скрипта.

Формат: "; Удалить".

-----

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

Формат: "; Очистить логи", или может быть таким:"; Очистка логов".

-----

К скрипту прилагается иконка скрипта для трея. Поместите её вместе с основным скриптом. Название иконки и скрипта, должны совпадать.


*/


; Начало открывающего блока

#SingleInstance Force
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

SplitPath, A_ScriptName, , , , ScriptName

SetTitleMatchMode, 2

DetectHiddenWindows, On

; Конец открывающего блока

; Начало Exit

GoTo, WrappingAroundExit ; Начало обтекания строк.

#Persistent
!sc02D:: ; Alt + X
ExitApp

WrappingAroundExit: ; Конец обтекания строк.

; Конец Exit

; Начало AHKScriptSaver

AutoRun = On ; | On | Off |


IfExist, %A_ScriptDir%\%ScriptName%.ico
	Menu, Tray, Icon , %A_ScriptDir%\%ScriptName%.ico

#MaxThreadsPerHotkey 2

FileRead, FileContents, %A_ScriptFullPath%
FoundPos := RegExMatch(FileContents, "(\; .*\R)*", ScriptInfo, 1)
FileContents = 
FoundPos := RegExMatch(ScriptInfo, "\; \\.*\R", ScriptSubDir, 1)
StringTrimLeft, ScriptSubDir, ScriptSubDir, 2
StringTrimRight, ScriptSubDir, ScriptSubDir, 2

StringReplace, CurrentWorkingDir, A_ScriptDir, %ScriptSubDir% ; Определяем реальную рабочую директорию.
SetWorkingDir %CurrentWorkingDir%
FoundPos := RegExMatch(CurrentWorkingDir, "[^*\\]*$", CurrentWorkingFolder, 1) ; Определяем папку рабочей директории.

GoTo WrappingAroundAHKScriptSaver ; Начало обтекания строк.

#IfWinActive, - Notepad++ ahk_class Notepad++, 
!1:: ; Alt + 1
If AHKScriptSaverStatus = On
	Return

If CopyAndCheckStatus =
{
	Send ^{sc01E} ; Ctrl + A
	Sleep 10
}

GoSub, CopyAndCheck
If CopyAndCheckStatus <> Success
	Return
Else
If CopyAndCheckStatus = Success
	CopyAndCheckStatus =

AHKScriptSaverStatus = On

FoundPos := RegExMatch(Clipboard, "(\; .*\R)*", ScriptInfo, 1)
FoundPos := RegExMatch(ScriptInfo, "\; .*\R", ScriptTitle, 1)
If ScriptTitle =
{
	MsgBox Копируемая область не опознана как скрипт, так как не имеет информацию о скрипте.`nОзнакомьтесь со справкой находящейся в начале тела данного скрипта перед использованием.
	AHKScriptSaverStatus =
	Return
}
FoundPos := RegExMatch(ScriptInfo, "\; Версия .*\R", ScriptVersion, 1)
FoundPos := RegExMatch(ScriptInfo, "\; \\.*\R", SubDir, 1)
FoundPos := RegExMatch(ScriptInfo, "\; Копировать\R", CopyOptions, 1)
FoundPos := RegExMatch(ScriptInfo, "\; Переименовать в .*\R", RenameOption, 1)
FoundPos := RegExMatch(ScriptInfo, "\; Удалить\R", DeleteOption, 1)
FoundPos := RegExMatch(ScriptInfo, "\; Очистить логи\R", LogCleaningOption, 1)
FoundPos := RegExMatch(ScriptInfo, "\; Очистка логов\R", LogCleaningOption2, 1)


StringTrimLeft, ScriptTitle, ScriptTitle, 2
StringTrimRight, ScriptTitle, ScriptTitle, 2

If ScriptVersion =
	ScriptVersion = 1
Else
{
	StringTrimLeft, ScriptVersion, ScriptVersion, 9
	StringTrimRight, ScriptVersion, ScriptVersion, 2
}

If SubDir <>
{
	StringTrimLeft, SubDir, SubDir, 3
	StringTrimRight, SubDir, SubDir, 2
	BsSubDir = \
	FolderInfo = Подпапка: %BsSubDir%%SubDir%
}
Else
{
	BsSubDir = 
	FolderInfo = Рабочая папка: \%CurrentWorkingFolder%
}

If CopyOptions <>
{
	StringTrimLeft, CopyOptions, CopyOptions, 2
	StringTrimRight, CopyOptions, CopyOptions, 2
}

If RenameOption <>
{
	StringTrimLeft, RenameOption, RenameOption, 18
	StringTrimRight, RenameOption, RenameOption, 2
	FinalScriptTitle = %RenameOption%
}
Else
	FinalScriptTitle = %ScriptTitle%

If DeleteOption <>
{
	StringTrimLeft, DeleteOption, DeleteOption, 2
	StringTrimRight, DeleteOption, DeleteOption, 2
}

If (LogCleaningOption <> "" OR LogCleaningOption2 <> "")
{
	LogCleaningOption = Очистить логи
	LogCleaningOption2 = 
	StringTrimLeft, LogCleaningOption, LogCleaningOption, 2
	StringTrimRight, LogCleaningOption, LogCleaningOption, 2
}


; Блок проверок файлов на существование.
CopyOperations =
AdditionalOperations = 
SourcePath =
BsSourcePath =

If DeleteOption <>
{
	IfExist, %SubDir%%BsSubDir%%ScriptTitle%.ahk
		CopyOperations = Удаление.
	Else
		CopyOperations = Ошибка удаления.
}
Else
If CopyOptions <>
{
	IfExist, %SubDir%%BsSubDir%%FinalScriptTitle%.ahk
		CopyOperations = С перезаписью.
}
Else
{
	FileCheck = 0
	Loop, %ScriptTitle%.ahk, 0, 1
	{
		LoopFileFullPath = %A_LoopFileFullPath%
		FileCheck = %A_Index%
	}
	
	If FileCheck = 1
		If LoopFileFullPath = %SubDir%%BsSubDir%%FinalScriptTitle%.ahk
			FileCheck = Перезапись
	
	If FileCheck = 0
	{}
	Else
	If FileCheck = Перезапись
		CopyOperations = С перезаписью.
	Else
	Loop, %ScriptTitle%.ahk, 0, 1
	{
		If A_LoopFileFullPath = %SubDir%%BsSubDir%%FinalScriptTitle%.ahk
		{
			MsgBox, 4, , Рабочая директория: %CurrentWorkingDir%`n`nНайденное совпадение.`n`nИсточник: \%A_LoopFileFullPath%`n`nХотите перезаписать источник?`n`n`nВы можете включить игнорирование функции перемещения для нужного скрипта, добавив: "; Копировать" в информацию о скрипте.
			IfMsgBox, Yes
			{
				CopyOperations = С перезаписью.
				Break
			}
			Else
				CopyOperations = Перезапись отменена.
				Continue
		}
		Else
		{
			If RenameOption =
			{
				MsgBox, 4, , Рабочая директория: %CurrentWorkingDir%`n`nНайденное совпадение.`n`nИсточник: \%A_LoopFileFullPath%`n`nПриемник: \%SubDir%%BsSubDir%%FinalScriptTitle%.ahk`n`nПереместить все файлы источника "\%A_LoopFileFullPath%" по шаблону "%ScriptTitle%", а также файлы и папки по шаблону "%ScriptTitle%_" к приемнику "\%SubDir%%BsSubDir%%FinalScriptTitle%.ahk"?`n`n`nВы можете включить игнорирование функции перемещения для нужного скрипта, добавив: "; Копировать" в информацию о скрипте.
				IfMsgBox, Yes
				{
					CopyOperations = С перемещением.
					If A_LoopFileDir <>
					{
						SourcePath = %A_LoopFileDir%
						BsSourcePath = \
					}
					AdditionalOperations = Тип копирования: С перемещением файлов по шаблону "%ScriptTitle%", а также файлов и папок по шаблону "%ScriptTitle%_" от источника: \%A_LoopFileFullPath%`nК приемнику: \%SubDir%%BsSubDir%%FinalScriptTitle%.ahk
					Break
				}
				Else
					Continue
			}
			Else
			If RenameOption <>
			{
				MsgBox, 4, , Рабочая директория: %CurrentWorkingDir%`n`nНайденное совпадение.`n`nИсточник: \%A_LoopFileFullPath%`n`nПриемник: \%SubDir%%BsSubDir%%FinalScriptTitle%.ahk`n`nПереместить все файлы источника "\%A_LoopFileFullPath%" по шаблону "%ScriptTitle%", а также файлы и папки по шаблону "%ScriptTitle%_" к приемнику "\%SubDir%%BsSubDir%%FinalScriptTitle%.ahk" с переименованием?`n`n`nВы можете включить игнорирование функции перемещения для нужного скрипта, добавив: "; Копировать" в информацию о скрипте.
				IfMsgBox, Yes
				{
					CopyOperations = С перемещением.
					If A_LoopFileDir <>
					{
						SourcePath = %A_LoopFileDir%
						BsSourcePath = \
					}
					AdditionalOperations = Тип копирования: С перемещением и перименованием файлов по шаблону "%ScriptTitle%", а также файлов и папок по шаблону "%ScriptTitle%_" от источника: \%A_LoopFileFullPath%`nК приемнику: \%SubDir%%BsSubDir%%FinalScriptTitle%.ahk
					Break
				}
				Else
					Continue
			}
		}
	}
}


If CopyOperations = Удаление.
{
	MsgBox, 4, , Удалить "\%SubDir%%BsSubDir%%ScriptTitle%.ahk" вместе с пренадлежащими файлами по шаблону "%ScriptTitle%", а также файлами и папками по шаблону "%ScriptTitle%_"?
	
	IfMsgBox Yes
	{
		Send ^{sc01F} ; Ctrl + S
		Sleep 10
		Send ^{sc011} ; Ctrl + W
		Sleep 10
		If ScriptTitle <> ScriptName
			WinKill, %A_WorkingDir%\%SubDir%%BsSubDir%%ScriptTitle%.ahk ahk_class AutoHotkey, , , ,
		
		FileCheck = 0
		FileCheck2 = 0
		FileCheck3 = 0
		FileCheck4 = 0
		
		Loop, %SubDir%%BsSubDir%*, 1, 0
			FileCheck = %A_Index%
		Loop, %SubDir%%BsSubDir%%ScriptTitle%_*, 1, 0
			FileCheck3 = %A_Index%
		Loop, %SubDir%%BsSubDir%%ScriptTitle%.*, 1, 0
			FileCheck4 = %A_Index%
		
		FileCheck2 := FileCheck3 + FileCheck4
		
		
		If FileCheck = %FileCheck2%
		{
			FileRecycle, %SubDir%
			AHKScriptSaverStatus =
			Return
		}
		Else
		{
			Loop, %SubDir%%BsSubDir%%ScriptTitle%_*, 2, 0
				FileRecycle, %A_LoopFileFullPath%
			
			Loop, %SubDir%%BsSubDir%%ScriptTitle%_*, 0, 0
				FileRecycle, %A_LoopFileFullPath%
			
			FileRecycle, %SubDir%%BsSubDir%%ScriptTitle%.*
			
			AHKScriptSaverStatus =
			Return
		}
	}
	Else
	{
		AHKScriptSaverStatus =
		Return
	}
}
Else
If CopyOperations = Ошибка удаления.
{
	MsgBox Ошибка удаления.`nСкрипт "\%SubDir%%BsSubDir%%ScriptTitle%.ahk" - не найден.
	AHKScriptSaverStatus =
	Return
}
Else
If CopyOperations = Перезапись отменена.
{
	AHKScriptSaverStatus =
	Return
}
Else
If CopyOperations =
	CopyOperations = С созданием.


If RenameOption <>
	If CopyOperations <> С перемещением.
	{
		MsgBox Либо переименование из "%ScriptTitle%.ahk" в "%FinalScriptTitle%.ahk" уже произошло, либо вы его отменили. Исправтье информацию о скрипте на актуальную, либо повторите попытку.
		AHKScriptSaverStatus =
		Return
	}

If AdditionalOperations =
	AdditionalOperations = Тип копирования: %CopyOperations%
If LogCleaningOption <>
	AdditionalOperations = %AdditionalOperations%`nДполнительно: Очистка логов.
MsgBox, 4, , Название: %FinalScriptTitle%.ahk`nВерсия: %ScriptVersion%`n%FolderInfo%`n%AdditionalOperations%
IfMsgBox Yes
{
	IfNotExist, %SubDir%
		FileCreateDir, %SubDir%
	
	If CopyOperations = С созданием.
	{
		WinActivate, - Notepad++ ahk_class Notepad++
		WinWaitActive, - Notepad++ ahk_class Notepad++
		Send ^{sc011} ; Ctrl + W
		Sleep 10
		FileAppend, %Clipboard%, %SubDir%%BsSubDir%%FinalScriptTitle%.ahk
	}
	Else
	If CopyOperations = С перезаписью.
		{
			FileDelete, %SubDir%%BsSubDir%%FinalScriptTitle%.ahk
			FileAppend, %Clipboard%, %SubDir%%BsSubDir%%FinalScriptTitle%.ahk
		}
	Else
	If CopyOperations = С перемещением.
	{
		WinActivate, - Notepad++ ahk_class Notepad++
		WinWaitActive, - Notepad++ ahk_class Notepad++
		Send ^{sc01F} ; Ctrl + S
		Sleep 10
		Send ^{sc011} ; Ctrl + W
		Sleep 10
	
	If ScriptTitle <> ScriptName
			WinKill, %A_WorkingDir%\%SourcePath%%BsSourcePath%%ScriptTitle%.ahk ahk_class AutoHotkey, , , ,
		
		Loop, %SourcePath%%BsSourcePath%%ScriptTitle%_*, 2, 0
		{
			StringReplace, SubTitle, A_LoopFileName, %ScriptTitle%
			FileMoveDir, %A_LoopFileFullPath%, %SubDir%%BsSubDir%%FinalScriptTitle%%SubTitle%, 2
		}
		
		Loop, %SourcePath%%BsSourcePath%%ScriptTitle%_*, 0, 0
		{
			StringReplace, SubTitle, A_LoopFileName, %ScriptTitle%
			FileMove, %A_LoopFileFullPath%, %SubDir%%BsSubDir%%FinalScriptTitle%%SubTitle%, 1
		}
		
		FileMove, %SourcePath%%BsSourcePath%%ScriptTitle%.*, %SubDir%%BsSubDir%%FinalScriptTitle%.*, 1
		
		FileCheck = 0
		Loop, %SourcePath%%BsSourcePath%*, 0, 1
			FileCheck = %A_Index%
		
		If FileCheck = 0
			FileRecycle, %SourcePath%
		
		
		FileDelete, %SubDir%%BsSubDir%%FinalScriptTitle%.ahk
		FileAppend, %Clipboard%, %SubDir%%BsSubDir%%FinalScriptTitle%.ahk
	}
	
	If LogCleaningOption <>
	{
		FileRecycle, %SubDir%%BsSubDir%%FinalScriptTitle%_VersionsLog
		FileRecycle, %SubDir%%BsSubDir%%FinalScriptTitle%_CopyLog
	}

	IfNotExist, %SubDir%%BsSubDir%%FinalScriptTitle%_VersionsLog\%FinalScriptTitle% Ver. %ScriptVersion%
		FileCreateDir, %SubDir%%BsSubDir%%FinalScriptTitle%_VersionsLog\%FinalScriptTitle% Ver. %ScriptVersion%

	FileRead, FileContents, %SubDir%%BsSubDir%%FinalScriptTitle%_VersionsLog\%FinalScriptTitle% Ver. %ScriptVersion%\VersionSettings.txt
	FoundPos := RegExMatch(FileContents, "Номер файла версии: .*\R", VersionFileNumber, 1)
	FileContents = 

	If  VersionFileNumber =
		VersionFileNumber = 1
	Else
	{
		StringTrimLeft, VersionFileNumber, VersionFileNumber, 20
		StringTrimRight, VersionFileNumber, VersionFileNumber, 2
		VersionFileNumber ++
	}
	FileDelete, %SubDir%%BsSubDir%%FinalScriptTitle%_VersionsLog\%FinalScriptTitle% Ver. %ScriptVersion%\VersionSettings.txt
	FileAppend, Имя: %FinalScriptTitle%`n`nВерсия: %ScriptVersion%`n`nНомер файла версии: %VersionFileNumber%`n, %SubDir%%BsSubDir%%FinalScriptTitle%_VersionsLog\%FinalScriptTitle% Ver. %ScriptVersion%\VersionSettings.txt

	FormatTime, FileTimeString, , yy'Y'.MM'M'.dd'D'.HH'H'.mm'Min'.ss'S'
	FileAppend, %Clipboard%, %SubDir%%BsSubDir%%FinalScriptTitle%_VersionsLog\%FinalScriptTitle% Ver. %ScriptVersion%\%FinalScriptTitle% Ver. %ScriptVersion%_%FileTimeString%_#%VersionFileNumber%.txt
	If AutoRun = On
	{
		Run, %SubDir%%BsSubDir%%FinalScriptTitle%.ahk
		WinKill, %A_WorkingDir%\%SubDir%%BsSubDir%%ScriptTitle%.ahk ahk_class AutoHotkey, , , ,
	}
	Clipboard =
	AHKScriptSaverStatus =
	Return
}
Else
{
	AHKScriptSaverStatus =
	Return
}

WrappingAroundAHKScriptSaver: ; Конец обтекания строк.

; Конец AHKScriptSaver

; Начало CopyAndCheck

CopyLog = Full ; | Full | Restricted | Raw | Off |

CopyErrorTime = 300

GoTo WrappingAroundCopyAndCheck ; Начало обтекания строк.

; Зачем вообще нужен CopyAndCheck?
; Основной проблемой с копированием из различных приложений с помощью AHK, является занесение в AHK предыдущего буфера обмена, даже с учётом того, что ClipWait уже подтвердил наличие изменения буфера обмена.
; Также, случается периодическое несрабатывание отправки нажатий, и ещё, в AHK может вернуться пустой буфер обмена.
; Этот скрипт, будет повторять копирование до тех пор, пока не будет получено непустое и не соответствующее маркеру текущего цикла повторения значение.
; Периодичность повторения, увеличивается с каждой критической ошибкой. Такими ошибками, является неудачное копирование и возврат пустого буфера обмена.


CopyAndCheck:
If CopyAndCheckStatus = On
{
	CopyAndCheckStatus = Abort
	Return
}
Else
If CopyAndCheckStatus = Abort
	Return

CopyAndCheck2:
If CopyAndCheckStatus =
	CopyAndCheckStatus = On
Else
If CopyAndCheckStatus = Abort
	GoTo AbortCopyAndCheck

ToolTipStatus = 1
SetTimer, CopyingToolTip, 0


GoSub, ChangeClipTag
If CopyLog = Full
{
	FormatTime, FastTimeString, , HH:mm:ss
	LogTextAdd = Время: %FastTimeString%`n`nClipKey: %ClipKey%`n`nВремя отложенного копирования: %CopyErrorTime% ms.
	LogText = %LogText%`n`n%LogTextAdd%
}

Clipboard = %ClipKey%
ClipWait
Loop ; Ожидание ClipKey в буфере обмена.
{
	If Clipboard = %ClipKey%
		Break
	Else
	{
		If CopyAndCheckStatus = Abort
			GoTo AbortCopyAndCheck
		
		CopyError = Буфер обмена не занёс ClipKey.
		If CopyLog = Full
		{
			LogTextAdd = Ошибка копирования: %CopyError% Номер итерации: %A_Index%.
			LogText = %LogText%`n`n%LogTextAdd%
		}
		Sleep 10
		Continue
	}
}


Send ^{sc02E} ; Ctrl + C
ClipWait
SetTimer, RepeatCopy, %CopyErrorTime%
Loop ; Ожидание текста в буфере обмена.
{
	If Clipboard = %ClipKey%
	{
		If CopyAndCheckStatus = Abort
			GoTo AbortCopyAndCheck
		
		CopyError = Буфер обмена не заменил ClipKey.
		If CopyLog = Full
		{
			LogTextAdd = Ошибка копирования: %CopyError% Номер итерации: %A_Index%.
			LogText = %LogText%`n`n%LogTextAdd%
		}
		Sleep 10
		Continue
	}
	Else
	{
		If Clipboard =
		{
			If CopyAndCheckStatus = Abort
				GoTo AbortCopyAndCheck

			CopyError = В буфере обмена пустота.
			SetTimer, RepeatCopy, Delete
			CopyErrorTime += 700
			If CopyLog = Full
			{
				LogTextAdd = Ошибка копирования: %CopyError%
				LogText = %LogText%`n`n%LogTextAdd%
			}
			Sleep %CopyErrorTime%
			GoTo CopyAndCheck2 ; Повторяем цикл заново.
		}
		Else
		{
			If CopyAndCheckStatus = Abort
				GoTo AbortCopyAndCheck
			
			CopyError = Успешно.
			CurrentCopyNumber ++
			SetTimer, RepeatCopy, Delete
			If CopyLog in Full,Restricted,Raw
			{
				FormatTime, TimeString
				FormatTime, FileTimeString, , yy'Y'.MM'M'.dd'D'.HH'H'
				FormatTime, FileTimeString2, , mm'Min'.ss'S'

				IfNotExist, %A_ScriptDir%\%ScriptName%_CopyLog\%ScriptName%_%FileTimeString%_CopyLog
				FileCreateDir, %A_ScriptDir%\%ScriptName%_CopyLog\%ScriptName%_%FileTimeString%_CopyLog

				FileRead, FileContents, %A_ScriptDir%\%ScriptName%_CopyLog\CopySettings.txt
				FoundPos := RegExMatch(FileContents, "Номер копии: .*\R", CopyNumber, 1)
				FileContents = 

				If  CopyNumber =
					CopyNumber = 1
				Else
				{
					StringTrimLeft, CopyNumber, CopyNumber, 13
					StringTrimRight, CopyNumber, CopyNumber, 2
					CopyNumber ++
				}
				FileDelete,  %A_ScriptDir%\%ScriptName%_CopyLog\CopySettings.txt
				FileAppend, Имя: %ScriptName%`n`nНомер копии: %CopyNumber%`n, %A_ScriptDir%\%ScriptName%_CopyLog\CopySettings.txt
			}
			If CopyLog = Full
			{
				FormatTime, FastTimeString, , HH:mm:ss
				LogTextAdd = %CopyError%`n`nВремя: %FastTimeString%
				LogText = %LogText%`n`n%LogTextAdd%
				FileAppend, Номер копии: %CopyNumber%`n`nНомер копии сеанса: %CurrentCopyNumber%`n`nВремя: %TimeString%`n`n`nЛоги копирования:%LogText%`n`n`nБуфер обмена:`n`n%Clipboard%, %A_ScriptDir%\%ScriptName%_CopyLog\%ScriptName%_%FileTimeString%_CopyLog\%ScriptName%_%FileTimeString2%_#%CopyNumber%_C#%CurrentCopyNumber%_CopyLog.txt
				LogText =
			}
			Else
			If CopyLog = Restricted
				FileAppend, Номер копии: %CopyNumber%`n`nНомер копии сеанса: %CurrentCopyNumber%`n`nВремя: %TimeString%`n`n`nБуфер обмена:`n`n%Clipboard%, %A_ScriptDir%\%ScriptName%_CopyLog\%ScriptName%_%FileTimeString%_CopyLog\%ScriptName%_%FileTimeString2%_#%CopyNumber%_C#%CurrentCopyNumber%_CopyLog.txt
			Else
			If CopyLog = Raw
				FileAppend, %Clipboard%, %A_ScriptDir%\%ScriptName%_CopyLog\%ScriptName%_%FileTimeString%_CopyLog\%ScriptName%_%FileTimeString2%_#%CopyNumber%_C#%CurrentCopyNumber%_CopyLog.txt
			
			
			CopyErrorTime = 300
			If ToolTipStatus = 1
			{
				ToolTip
				ToolTipStatus =
			}
			CopyAndCheckStatus = Success
			Break
		}
	}
}
Return

RepeatCopy:
CopyError = Копирование не удалось.
CopyErrorTime += 700
If CopyLog = Full
{
	FormatTime, FastTimeString, , HH:mm:ss
	LogTextAdd = Ошибка копирования: %CopyError%`n`nВремя: %FastTimeString%`n`nClipKey: %ClipKey%`n`nВремя отложенного копирования: %CopyErrorTime% ms.
	LogText = %LogText%`n`n%LogTextAdd%
}

Send ^{sc02E} ; Ctrl + C
ClipWait

SetTimer, RepeatCopy, %CopyErrorTime%
Return

ChangeClipTag:
Loop
{
	Random, ClipTagNew , 10, 99
	If ClipTagNew = %ClipTag%
		Continue
	Else
	{
		ClipTag = %ClipTagNew%
		ClipKey = ClipTag #%ClipTag%
		Break
	}
}
Return

CopyingToolTip:
SetTimer, CopyingToolTip, 1500

If ToolTipStatus <> 1
	SetTimer, CopyingToolTip, Delete
Else
If ToolTipStatus = 1
	ToolTip, Подождите. Происходит копирование.
Return

AbortCopyAndCheck:
SetTimer, RepeatCopy, Delete
LogText =
CopyErrorTime = 300
If ToolTipStatus = 1
{
	ToolTip
	ToolTipStatus =
}
SetTimer, AbortedCopyAndCheck, Delete
SetTimer, AbortedCopyAndCheck, 0
CopyAndCheckStatus =
Return

AbortedCopyAndCheck:
SetTimer, AbortedCopyAndCheck, Off
ToolTipStatus = 2
ToolTip, Отменено пользователем.
Sleep 1500
If ToolTipStatus = 2
{
	ToolTip
	ToolTipStatus = 
}
Return

WrappingAroundCopyAndCheck: ; Конец обтекания строк.

; Конец CopyAndCheck
Post's attachments

AHK Script Saver.ico 110.46 kb, 2 downloads since 2019-10-28 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Script Saver

Bulef пишет:

логирования версий, логирования копирований, перемещения и функция переименования скриптов.

Добро пожаловать в клуб пользователей систем версионирования! Я лично пользуюсь системой от товарища Линуса, уверен и вы туда придете со временем. Некоторый порог входа конечно есть, но в итоге она заменит вам ваш велосипед, облако, и будет даже удобнее.

3 (изменено: Bulef, 2019-10-29 10:51:48)

Re: AHK: Script Saver

stealzy пишет:
Bulef пишет:

логирования версий, логирования копирований, перемещения и функция переименования скриптов.

Добро пожаловать в клуб пользователей систем версионирования! Я лично пользуюсь системой от товарища Линуса, уверен и вы туда придете со временем. Некоторый порог входа конечно есть, но в итоге она заменит вам ваш велосипед, облако, и будет даже удобнее.

Спасибо за ответ. Я предполагал, что изобрёл велосипед.
А где можно почитать про это? Я только Торвальдса Линуса знаю. Про него идёт речь?

4

Re: AHK: Script Saver

Да, про него .