Тема: AHK: Компиляция без инсталяции компилятора
Приветствую.
Сабж и пояснения.
Мне по работе часто приходиться "носиться" между компами и производить компиляцию под требования заказчика, а значит надо устанавливать AHK, но они его частенько сносят.
Я написал пакетную компиляцию.
;Пример определения секции для компиляции
;Компиляция по умолчанию отсутствует, т.к. это излишне, просто вопользуйтесь Ahk2Exe.exe
[Main]
;Рабочая папка компилятора
WorkingDir=C:\Program Files\AutoHotkey\Compiler
;Компилятор
Compiler=C:\Program Files\AutoHotkey\Compiler\Ahk2Exe.exe
;Входной файл AHK-file
keyIN=C:\AHK\Comple\Compiler.ahk
;Выходная директория и выходной Exe-file
keyOUT=C:\AHK Compiler\AHK Compiler.exe
;Ico-file для выходного Exe-file
keyICON=C:\AHK Compiler\ICO\AHK Compiler.ico
;Base file BIN(AutoHotkeySC.bin/ANSI 32-bit.bin/Unicode 32-bit.bin/Unicode 64-bit.bin) для выходного Exe-file
keyBIN=Unicode 64-bit.bin
;Выходной Exe-file сжимать/не сжимать=1/0. Для сжатия нужна программа mpress.exe
keyMPRESS=1
и
;Тут только OK
сMsgBoxInfo_Ok :=0+8192+64 ;only an OK button + Task Modal + Icon Asterisk(info)
сMsgBoxError_Ok :=0+8192+16 ;only an OK button + Task Modal + Icon Hand (stop/error)
сMsgBoxChoice_Ok :=0+8192+48 ;only an OK button + Task Modal + Icon Exclamation
vQuote := """"
;Чтение и проверка Ini-file
FileINI := fnGetFileINI()
Secion := "Main"
ChkDir := 1
ChkFile := 2
Trip := -1
;Рабочая папка компилятора
WorkingDir := fnIniRead(FileINI, Secion, "WorkingDir", ChkDir)
If (WorkingDir = Trip)
Goto lEnd_AHK_Compile
WorkingDir := WorkingDir "\"
;Компилятор
Compiler := fnIniRead(FileINI, Secion, "Compiler", ChkFile)
If (Compiler = Trip)
Goto lEnd_AHK_Compile
;Входной файл AHK-file
keyIN := fnIniRead(FileINI, Secion, "keyIN", ChkFile)
If (keyIN = Trip)
Goto lEnd_AHK_Compile
keyIN := vQuote keyIN vQuote
;Выходная директория и файл
keyOUT := fnIniRead(FileINI, Secion, "keyOUT")
If (keyOUT = Trip)
Goto lEnd_AHK_Compile
Needle := "\"
vPos := InStr(keyOUT, Needle , , 0)
VarDir := SubStr(keyOUT, 1 , vPos-1)
VarFile := SubStr(keyOUT, vPos+1)
NameProc := VarFile
keyOUT := vQuote keyOUT vQuote
if (!InStr(FileExist(VarDir), "D"))
{
MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
,`n`nОшибка в секции %Secion% в переменной keyOUT`n`n Пути %VarDir% не существует`n`nВыход из программы.
,15
Goto lEnd_AHK_Compile
}
;Ico-file для выходного Exe-file
keyICON := fnIniRead(FileINI, Secion, "keyICON", ChkFile)
If (keyICON = Trip)
Goto lEnd_AHK_Compile
keyICON := vQuote keyICON vQuote
;Base file BIN(AutoHotkeySC.bin/ANSI 32-bit.bin/Unicode 32-bit.bin/Unicode 64-bit.bin) для выходного Exe-file
keyBIN := fnIniRead(FileINI, Secion, "keyBIN")
If (keyBIN = Trip)
Goto lEnd_AHK_Compile
keyBIN := vQuote keyBIN vQuote
;Выходной Exe-file сжимать/не сжимать=1/0 нужна программа mpress.exe
keyMPRESS := fnIniRead(FileINI, Secion, "keyMPRESS")
If (keyBIN = Trip)
Goto lEnd_AHK_Compile
If (fnCheckExistProc(NameProc))
{
MsgBox % сMsgBoxChoice_Ok, Ошибка компиляции
,`n`nСледует завершить процесс %NameProc%`n`n Заршите процесс %NameProc%!`n`nВыход из программы
,10
Goto lEnd_AHK_Compile
}
Target := Compiler " /in " keyIN " /out " keyOUT " /icon " keyICON " /bin " keyBIN " /mpress " keyMPRESS
Run, %Target% , %WorkingDir%
; Успешная компиляция
MsgBox % сMsgBoxInfo_Ok, Успешная компиляция
,`n`n Компиляции скрипта завершена`n`n DONE! `n`n Выход из программы.
,3
lEnd_AHK_Compile:
ExitApp
fnIniRead(FilenameINI, SectionINI := "", KeyINI := "", CheckDirOrFile := False)
{
Global ;----------------------------
IniRead, VarKey, %FilenameINI%, % SectionINI, % KeyINI
if (VarKey="ERROR")
{
MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
,`n`nОшибка в секции %SectionINI% в переменной %KeyINI%`n`nОпределена не верно`n`nВыход из программы
,15
Return -1
}
If (CheckDirOrFile = False) ;Ничего не проверяем
Return VarKey
If (CheckDirOrFile = 1) ;Проверяем путь, т.е. директорию
{
if (!InStr(FileExist(VarKey), "D"))
{
MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
,`n`nОшибка в секции %SectionINI% в переменной %KeyINI%`n`nПути %VarKey% не существует`n`nВыход из программы.
,15
Return -1
}
}
If (CheckDirOrFile = 2) ;Проверяем наличие файла в полном пути
{
if (!FileExist(VarKey))
{
MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
,`n`nОшибка в секции %SectionINI% в переменной %KeyINI%`n`nФайла %VarKey% не существует`n`nВыход из программы.
,15
Return -1
}
}
Return VarKey
}
fnGetFileINI(){
global
If %0% ; Выборка аргументов командной строки = только один аргумет
{
args := []
vCountArgs := 0
Loop %0%
{
args[A_Index] := %A_Index%
vCountArgs++
}
}
vIniFile := args[1]
If (vCountArgs < 1)
{
;Не указан ini-файл, вызываем диалог выбора ini-файла
vPrompt := "Выберите ini-файл для компиляции скрипта"
vIniFile := ;
vOptions := 1+2
vIniDir := "*C:\AHK Compiler\INI\"
vFilter := "*.ini"
FileSelectFile, vIniFile, %vOptions%, %vIniDir%, %vPrompt%, %vFilter%
if (ErrorLevel = 1)
{
MsgBox % сMsgBoxError_Ok, Ошибка в INI - файле
,`n`n Не указан ini-файл для компиляции скрипта`n Укажите ini-файл как параметр`n`n Выход из программы.
,30
ExitApp
}
}
Return vIniFile
}
;---------------------------Функция проверки существования процесса-----------------------------
; Вход (имя процесса полное, т.е. exe-файл)
; Ответ True/False = процесс работает(существует)/не работает(не существует)
fnCheckExistProc(ByRef vPIDName)
{
Thread, NoTimers
; Проверяем существование процесса vPIDName
Process, Exist, %vPIDName%
if (ErrorLevel = 0)
vRet := False ; Программа и/или скрипт не запущен
Else
vRet := True
Thread, NoTimers, false
Return vRet ; Выходим с ответом
}
Если просто скопировать содержимое папки C:\Program Files\AutoHotkey\Compiler и записать его командой FileInstall в Compiler.exe, то будет компиляция или тут есть "подводные камни"?
Если так можно, то какие поправки надо внести в Compiler.ini и Compiler.ahk?
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019 Click to Download