1

Тема: AHK: Компиляция без инсталяции компилятора

Приветствую.

Сабж и пояснения.
Мне по работе часто приходиться "носиться" между компами и производить компиляцию под требования заказчика, а значит надо устанавливать AHK, но они его частенько сносят.

Я написал пакетную компиляцию.

+ Compiler.ini
;Пример определения секции для компиляции
;Компиляция по умолчанию отсутствует, т.к. это излишне, просто вопользуйтесь 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

и

+ Compiler.ahk
;Тут только 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

2

Re: AHK: Компиляция без инсталяции компилятора

и записать его командой FileInstall в Compiler.exe

В каком смысле? Вы при себе имеете флешку с собственным пакетным компилятором в виде исполняемого файла (exe)?

3 (изменено: Indomito, 2017-01-13 23:41:27)

Re: AHK: Компиляция без инсталяции компилятора

ypppu пишет:

Вы при себе имеете флешку с собственным пакетным компилятором в виде исполняемого файла (exe)?

Так точно, компилирую на своём компьютере Compiler.ahk в Compiler.exe, который создаёт структуру директорий на другом компьютере при запуске Compiler.exe, в коде это пока нет, но будет.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

4

Re: AHK: Компиляция без инсталяции компилятора

Если каких-то особых разрешений не нужно, компилятор должен скопироваться в C:\Program Files\AutoHotkey\Compiler. Есть права администратора - значит всё Ok.

5 (изменено: Indomito, 2017-01-14 01:01:38)

Re: AHK: Компиляция без инсталяции компилятора

ypppu

Обязательно в папку C:\Program Files\AutoHotkey\Compiler? Она описана для компиляции самого компилятора.

А можно в папку C:\AHK Compiler, т.е. в папку пакетной компиляции или иную?

P.S. Вопрос глупый, я сам понимаю, но решил уточнить.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

6

Re: AHK: Компиляция без инсталяции компилятора

Можно в любую папку, компилятору всё равно где лежать.

7

Re: AHK: Компиляция без инсталяции компилятора

ypppu

Спасибо, вопросов нет. Буду проверять

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download