1

Тема: AHK: Самоуничтожение скомпилированого скрипта

Как можно самоуничтожить скомпилированый скрипт средствами AutoHotKey? Так что бы при завершении скрипта он удалялся из жесткого диска.

Сделал что то подобное с помощью VBScript:

SetWorkingDir %A_ScriptDir%

OnExit, ExitDelete

Esc::
ExitDelete:
FileAppend,
(
Set FSO = CreateObject("Scripting.FileSystemObject")
t = 0: On Error Resume Next
WScript.Sleep(1000)
Set File = FSO.GetFile("%A_ScriptDir%\%A_ScriptName%")
File.Delete
Set File = FSO.GetFile(WScript.ScriptFullName)
File.Delete
), %A_ScriptDir%\del.vbs
FileSetAttrib, +H+S, %A_ScriptDir%\del.vbs
Run, del.vbs, , UseErrorLevel
ExitApp

Но в некоторых случаях этот VBScript почему то выдает ошибку сценария, что не есть хорошо и надежно.

Хотелось бы знать можно ли это реализовать как то средствами AHK.

2

Re: AHK: Самоуничтожение скомпилированого скрипта

Вот так примерно:

PID := DllCall("GetCurrentProcessId")
OnExit, Exit
ExitApp

Exit:
   Script =
   (
      #NoTrayIcon
      Loop
      {
         Sleep, 100
         Process, Exist, %PID%
         if !ErrorLevel 
            break
      }
      FileDelete, %A_ScriptFullPath%
      FileDelete, `%A_ScriptFullPath`%
      ExitApp
   )
   FileAppend, % Script, %A_Temp%\Kill.ahk
   Run, %A_Temp%\Kill.ahk
   ExitApp
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: avens, 2013-07-25 14:35:13)

Re: AHK: Самоуничтожение скомпилированого скрипта

Этот вариант хорош если на компьютере установлен AutoHotKey, который запускает файлы с расширением .ahk
Мне нужно что бы срабатывало и в тех случаях, когда AHK не установлен на компьютере. И что бы не оставалось больше никаких посторонних файлов.

4

Re: AHK: Самоуничтожение скомпилированого скрипта

Так ты же сам просил силами AHK гг). Исполняемый файл сам себя удалить не может.
Твой код выдаёт ошибку потому, что пытается удалить файл, который ещё не завершил работу, нужна проверка существования его процесса:

PID := DllCall("GetCurrentProcessId")
OnExit, Exit
ExitApp

Exit:
   Script =
   (
      Set objWMI = GetObject("winmgmts:")
      Do
         WScript.Sleep 100
      Loop Until objWMI.ExecQuery("Select * from Win32_Process Where ProcessId = '%PID%'").Count = 0
         
      Set FSO = CreateObject("Scripting.FileSystemObject")
      FSO.GetFile("%A_ScriptFullPath%").Delete
      FSO.GetFile(WScript.ScriptFullName).Delete
   )
   FileAppend, % Script, %A_Temp%\Kill.vbs
   Run, %A_Temp%\Kill.vbs
   ExitApp
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Самоуничтожение скомпилированого скрипта

Наверное наиболее целесообразнее будет использовать VBScript от teadrinker.

Благодарю всех!

Удачи!

6 (изменено: KepocuH, 2013-08-05 17:13:27)

Re: AHK: Самоуничтожение скомпилированого скрипта

Я делал вот так:

    
;
;тут текст скрипта
;
bat = ping 127.0.0.1 > NUL`ndel /F /Q CompiledScript.exe`ndel /F /Q delete.bat
FileDelete, delete.bat
FileAppend %bat%, delete.bat
Run delete.bat, ,Hide 
ExitApp

Вроде работает без ошибок.

7

Re: AHK: Самоуничтожение скомпилированого скрипта

KepocuH пишет:

Вроде работает без ошибок.

Ничем не лучше самого первого варианта, где вместо проверки существования процесса просто Sleep. Нет гарантии, что данного промежутка времени в любом случае хватит.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Самоуничтожение скомпилированого скрипта

Продолжение темы.