Тема: 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