<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Script Saver]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=15040&amp;type=atom" />
	<updated>2019-10-29T08:27:49Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=15040</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Script Saver]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=136485#p136485" />
			<content type="html"><![CDATA[<p>Да, про него <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />.</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2019-10-29T08:27:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=136485#p136485</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Script Saver]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=136484#p136484" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>stealzy пишет:</cite><blockquote><div class="quotebox"><cite>Bulef пишет:</cite><blockquote><p>логирования версий, логирования копирований, перемещения и функция переименования скриптов.</p></blockquote></div><p>Добро пожаловать в клуб пользователей систем версионирования! Я лично пользуюсь системой от товарища Линуса, уверен и вы туда придете со временем. Некоторый порог входа конечно есть, но в итоге она заменит вам ваш велосипед, облако, и будет даже удобнее.</p></blockquote></div><p>Спасибо за ответ. Я предполагал, что изобрёл велосипед.<br />А где можно почитать про это? Я только Торвальдса Линуса знаю. Про него идёт речь?</p>]]></content>
			<author>
				<name><![CDATA[Bulef]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=40368</uri>
			</author>
			<updated>2019-10-29T06:51:34Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=136484#p136484</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Script Saver]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=136478#p136478" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Bulef пишет:</cite><blockquote><p>логирования версий, логирования копирований, перемещения и функция переименования скриптов.</p></blockquote></div><p>Добро пожаловать в клуб пользователей систем версионирования! Я лично пользуюсь системой от товарища Линуса, уверен и вы туда придете со временем. Некоторый порог входа конечно есть, но в итоге она заменит вам ваш велосипед, облако, и будет даже удобнее.</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2019-10-28T21:48:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=136478#p136478</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Script Saver]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=136473#p136473" />
			<content type="html"><![CDATA[<p>Создал для себя скрипт для создания других скриптов. Работает он с помощью информации о местоположении и названии скрипта, помещаемого в тело самого скрипта. Примером является сам скрипт. Все действия, происходят относительно местоположения основного скрипта. Есть функции логирования версий, логирования копирований, перемещения и функция переименования скриптов. Иконка скрипта в прикреплении. Делался скрипт, с оглядкой на Notepad++.<br /></p><div class="codebox"><pre><code>; AHK Script Saver
; Версия 1.08 Notepad++
; \AHK Script Saver

/*


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

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

-----

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

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

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

-----


; Это сноска.

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

-----

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

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

-----

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

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

-----

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

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

-----

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

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

-----

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

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

-----

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

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

-----

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

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

-----

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

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

-----

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


*/


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

#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, &quot;(\; .*\R)*&quot;, ScriptInfo, 1)
FileContents = 
FoundPos := RegExMatch(ScriptInfo, &quot;\; \\.*\R&quot;, ScriptSubDir, 1)
StringTrimLeft, ScriptSubDir, ScriptSubDir, 2
StringTrimRight, ScriptSubDir, ScriptSubDir, 2

StringReplace, CurrentWorkingDir, A_ScriptDir, %ScriptSubDir% ; Определяем реальную рабочую директорию.
SetWorkingDir %CurrentWorkingDir%
FoundPos := RegExMatch(CurrentWorkingDir, &quot;[^*\\]*$&quot;, 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 &lt;&gt; Success
	Return
Else
If CopyAndCheckStatus = Success
	CopyAndCheckStatus =

AHKScriptSaverStatus = On

FoundPos := RegExMatch(Clipboard, &quot;(\; .*\R)*&quot;, ScriptInfo, 1)
FoundPos := RegExMatch(ScriptInfo, &quot;\; .*\R&quot;, ScriptTitle, 1)
If ScriptTitle =
{
	MsgBox Копируемая область не опознана как скрипт, так как не имеет информацию о скрипте.`nОзнакомьтесь со справкой находящейся в начале тела данного скрипта перед использованием.
	AHKScriptSaverStatus =
	Return
}
FoundPos := RegExMatch(ScriptInfo, &quot;\; Версия .*\R&quot;, ScriptVersion, 1)
FoundPos := RegExMatch(ScriptInfo, &quot;\; \\.*\R&quot;, SubDir, 1)
FoundPos := RegExMatch(ScriptInfo, &quot;\; Копировать\R&quot;, CopyOptions, 1)
FoundPos := RegExMatch(ScriptInfo, &quot;\; Переименовать в .*\R&quot;, RenameOption, 1)
FoundPos := RegExMatch(ScriptInfo, &quot;\; Удалить\R&quot;, DeleteOption, 1)
FoundPos := RegExMatch(ScriptInfo, &quot;\; Очистить логи\R&quot;, LogCleaningOption, 1)
FoundPos := RegExMatch(ScriptInfo, &quot;\; Очистка логов\R&quot;, 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 &lt;&gt;
{
	StringTrimLeft, SubDir, SubDir, 3
	StringTrimRight, SubDir, SubDir, 2
	BsSubDir = \
	FolderInfo = Подпапка: %BsSubDir%%SubDir%
}
Else
{
	BsSubDir = 
	FolderInfo = Рабочая папка: \%CurrentWorkingFolder%
}

If CopyOptions &lt;&gt;
{
	StringTrimLeft, CopyOptions, CopyOptions, 2
	StringTrimRight, CopyOptions, CopyOptions, 2
}

If RenameOption &lt;&gt;
{
	StringTrimLeft, RenameOption, RenameOption, 18
	StringTrimRight, RenameOption, RenameOption, 2
	FinalScriptTitle = %RenameOption%
}
Else
	FinalScriptTitle = %ScriptTitle%

If DeleteOption &lt;&gt;
{
	StringTrimLeft, DeleteOption, DeleteOption, 2
	StringTrimRight, DeleteOption, DeleteOption, 2
}

If (LogCleaningOption &lt;&gt; &quot;&quot; OR LogCleaningOption2 &lt;&gt; &quot;&quot;)
{
	LogCleaningOption = Очистить логи
	LogCleaningOption2 = 
	StringTrimLeft, LogCleaningOption, LogCleaningOption, 2
	StringTrimRight, LogCleaningOption, LogCleaningOption, 2
}


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

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


If CopyOperations = Удаление.
{
	MsgBox, 4, , Удалить &quot;\%SubDir%%BsSubDir%%ScriptTitle%.ahk&quot; вместе с пренадлежащими файлами по шаблону &quot;%ScriptTitle%&quot;, а также файлами и папками по шаблону &quot;%ScriptTitle%_&quot;?
	
	IfMsgBox Yes
	{
		Send ^{sc01F} ; Ctrl + S
		Sleep 10
		Send ^{sc011} ; Ctrl + W
		Sleep 10
		If ScriptTitle &lt;&gt; 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Скрипт &quot;\%SubDir%%BsSubDir%%ScriptTitle%.ahk&quot; - не найден.
	AHKScriptSaverStatus =
	Return
}
Else
If CopyOperations = Перезапись отменена.
{
	AHKScriptSaverStatus =
	Return
}
Else
If CopyOperations =
	CopyOperations = С созданием.


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

If AdditionalOperations =
	AdditionalOperations = Тип копирования: %CopyOperations%
If LogCleaningOption &lt;&gt;
	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 &lt;&gt; 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 &lt;&gt;
	{
		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, &quot;Номер файла версии: .*\R&quot;, 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&#039;Y&#039;.MM&#039;M&#039;.dd&#039;D&#039;.HH&#039;H&#039;.mm&#039;Min&#039;.ss&#039;S&#039;
	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&#039;Y&#039;.MM&#039;M&#039;.dd&#039;D&#039;.HH&#039;H&#039;
				FormatTime, FileTimeString2, , mm&#039;Min&#039;.ss&#039;S&#039;

				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, &quot;Номер копии: .*\R&quot;, 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 &lt;&gt; 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</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Bulef]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=40368</uri>
			</author>
			<updated>2019-10-28T10:11:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=136473#p136473</id>
		</entry>
</feed>
