Автор Тема: Самоуничтожение скрипта  (Прочитано 16941 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349
  • Репутация: 2690
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Самоуничтожение скрипта
« Создано: Октябрь 11, 2009, 16:05:27 »
Функция удаляет скрипт, из которого была вызвана. Работает так: создает в Temp папке BAT файл, затем запускает его. В свою очередь, BAT файл ждет завершения основной программы, после чего удаляет ее и себя.


Код: AutoIt [Выделить]
#Include <File.au3>

Func _ScriptDestroy()
    $sTemp = _TempFile(@TempDir, '~', '.bat')
    $sPath = FileGetShortName(@ScriptFullPath)
    $hFile = FileOpen($sTemp, 2)
    FileWriteLine($hFile, [email protected] off')
    FileWriteLine($hFile, ':loop')
    FileWriteLine($hFile, 'del ' & $sPath)
    FileWriteLine($hFile, 'if exist ' & $sPath & ' goto loop')
    FileWriteLine($hFile, 'del ' & $sTemp)
    FileClose($hFile)
    Run($sTemp, '', @SW_HIDE)
EndFunc   ;==>_ScriptDestroy

_ScriptDestroy()
MsgBox(0, '', 'Wait...')
 

« Последнее редактирование: Октябрь 12, 2009, 01:04:06 от Yashied »


Думай, прежде чем говорить.

Русское сообщество AutoIt

Самоуничтожение скрипта
« Отправлен: Октябрь 11, 2009, 16:05:27 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7787
  • Репутация: 2278
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Самоуничтожение скрипта
« Ответ #1, Отправлен: Декабрь 07, 2009, 21:56:24 »
Кстати, вводим в SciTE (тот что в поставке с AutoIt) selfdelete, нажимаем пробел, и получаем подобную функцию :)


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн Suppir [?]

  • Продвинутый
  • ***
  • Сообщений: 967
  • Репутация: 61
    • Награды
Re: Самоуничтожение скрипта
« Ответ #2, Отправлен: Декабрь 08, 2009, 10:19:36 »
А у меня нет в scite такой функции

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7787
  • Репутация: 2278
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Самоуничтожение скрипта
« Ответ #3, Отправлен: Декабрь 08, 2009, 17:47:23 »
Suppir [?]
Цитировать
меня нет в scite такой функции
Видимо SciTE не последний, ну или не тот что в наборе с AutoIt идёт.

Русское сообщество AutoIt

Re: Самоуничтожение скрипта
« Ответ #3 Отправлен: Декабрь 08, 2009, 17:47:23 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7789
  • Репутация: 2313
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Самоуничтожение скрипта
« Ответ #4, Отправлен: Декабрь 16, 2009, 03:34:14 »
ввел в SciTE  selfdelete, нажал пробел получил функцию:
_SelfDelete()

Func _SelfDelete($iDelay = 0)
Local $sCmdFile
FileDelete(@TempDir & "\scratch.bat")
$sCmdFile = 'ping -n ' & $iDelay & '127.0.0.1 > nul' & @CRLF _
& ':loop' & @CRLF _
& 'del "' & @ScriptFullPath & '" > nul' & @CRLF _
& 'if exist "' & @ScriptFullPath & '" goto loop' & @CRLF _
& 'del ' & @TempDir & '\scratch.bat'
FileWrite(@TempDir & "\scratch.bat", $sCmdFile)
Run(@TempDir & "\scratch.bat", @TempDir, @SW_HIDE)
EndFunc
Только скрипт у меня с этой функцией не самоудалился ни из SciTE, ни скомпилированный.
Почему?

PS
А функция Func _ScriptDestroy() от Yashied самоудаляется.

PPS
Разобрался. Функция Func _ScriptDestroy() от Yashied адаптирована к русской Windows за счет $sPath = FileGetShortName(@ScriptFullPath). А встроенная по selfdelete указывает длинные пути, в которых русские буквы отображаются кракозябрами, и батник ничего не находит.
« Последнее редактирование: Декабрь 16, 2009, 05:12:59 от madmasles »

Оффлайн Денис [?]

  • Новичок
  • *
  • Сообщений: 35
  • Репутация: 8
  • Пол: Мужской
    • Награды
Re: Самоуничтожение скрипта
« Ответ #5, Отправлен: Июнь 23, 2010, 19:48:00 »
Функция удаляет скрипт, из которого была вызвана. Работает так: создает в Temp папке BAT файл, затем запускает его. В свою очередь, BAT файл ждет завершения основной программы, после чего удаляет ее и себя.

Очень хороший скрипт, но я бы совсем немного его изменил следующим образом:

Код: AutoIt [Выделить]
#Include <File.au3>

Func _ScriptDestroy()
    If StringRight(@ScriptFullPath,3) <> "au3" Then
        $sTemp = _TempFile(@TempDir, '~', '.bat')
        $sPath = FileGetShortName(@ScriptFullPath)
        $hFile = FileOpen($sTemp, 2)
        FileWriteLine($hFile, [email protected] off')
        FileWriteLine($hFile, ':loop')
        FileWriteLine($hFile, 'del ' & $sPath)
        FileWriteLine($hFile, 'if exist ' & $sPath & ' goto loop')
        FileWriteLine($hFile, 'del ' & $sTemp)
        FileClose($hFile)
        Run($sTemp, '', @SW_HIDE)
    EndIf
EndFunc
 


Это позволит при отладке не удалять исходный файл скрипта .au3
На мой взгляд это полезно потому как я чуть не потерял результаты месячной работы. Спас только backUp.
« Последнее редактирование: Июнь 23, 2010, 19:56:59 от Денис »

Оффлайн StarEdik [?]

  • Благодарен всем за поддержку
  • Новичок
  • *
  • Сообщений: 365
  • Репутация: 4
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Самоуничтожение скрипта
« Ответ #6, Отправлен: Июнь 12, 2012, 16:33:01 »
Как это использоват в windows 7 64 bit (All )
« Последнее редактирование: Июнь 12, 2012, 19:46:53 от StarEdik »
Скорблю и помню.

Знать одно, но знать и помогать не каждому дано.
ОН всегда всем помогал. Сделал добро и ушел, но остался в памяти у многих

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349

  • Автор темы
  • Репутация: 2690
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Самоуничтожение скрипта
« Ответ #7, Отправлен: Июнь 12, 2012, 20:11:04 »
Как это использоват в windows 7 64 bit (All)

Так же, как и в XP.

Русское сообщество AutoIt

Re: Самоуничтожение скрипта
« Ответ #7 Отправлен: Июнь 12, 2012, 20:11:04 »

Оффлайн amorphyc [?]

  • Новичок
  • *
  • Сообщений: 30
  • Репутация: 0
  • Пол: Мужской
    • Награды
Re: Самоуничтожение скрипта
« Ответ #8, Отправлен: Июль 16, 2012, 19:57:26 »
А у меня вот такая ошибка получается! Что делать, не пойму!

Доктор, не лечи меня, я не больной!

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349

  • Автор темы
  • Репутация: 2690
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Самоуничтожение скрипта
« Ответ #9, Отправлен: Июль 16, 2012, 20:13:22 »
Что делать, не пойму!

Правильно скопировать пример, включая самую первую строчку.

Оффлайн astati [?]

  • Новичок
  • *
  • Сообщений: 145
  • Репутация: 4
    • Награды
Re: Самоуничтожение скрипта
« Ответ #10, Отправлен: Июль 16, 2012, 20:53:21 »
Сори за тупой вопрос. НО функцию самому прописывать на запуск или можно просто вставить?

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349

  • Автор темы
  • Репутация: 2690
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Самоуничтожение скрипта
« Ответ #11, Отправлен: Июль 16, 2012, 21:06:25 »
В самом начале скрипта обязательно пишешь:

Код: AutoIt [Выделить]
#Include <File.au3>


В этой библиотеке находится функция _TempFile(). Далее внизу скрипта вставляешь функцию из примера:

Код: AutoIt [Выделить]
Func _ScriptDestroy()
    $sTemp = _TempFile(@TempDir, '~', '.bat')
    $sPath = FileGetShortName(@ScriptFullPath)
    $hFile = FileOpen($sTemp, 2)
    FileWriteLine($hFile, [email protected] off')
    FileWriteLine($hFile, ':loop')
    FileWriteLine($hFile, 'del ' & $sPath)
    FileWriteLine($hFile, 'if exist ' & $sPath & ' goto loop')
    FileWriteLine($hFile, 'del ' & $sTemp)
    FileClose($hFile)
    Run($sTemp, '', @SW_HIDE)
EndFunc   ;==>_ScriptDestroy


И только после этого в теле скрипта, там где это тебе необходимо, пишешь вызов этой функции:

Код: AutoIt [Выделить]
_ScriptDestroy()


После того, как будет вызвана эта функция, обратного пути уже не будет. Как только скрипт закончит свою работу, файл будет безвозвратно удален. В каком месте вызывать _ScriptDestroy() по большему счету не имеет значения, т.к. это только инициирует отложенное удаление, до завершения скрипта.

Оффлайн amorphyc [?]

  • Новичок
  • *
  • Сообщений: 30
  • Репутация: 0
  • Пол: Мужской
    • Награды
Re: Самоуничтожение скрипта
« Ответ #12, Отправлен: Июль 17, 2012, 16:34:50 »
Yashied, Ой,спасибо огромное! )) Наставил дурака на путь истинный! )) Я и правда первую строку не так писал! Все работает отлично! Спасибо!

Оффлайн _dron_ [?]

  • Новичок
  • *
  • Сообщений: 84
  • Репутация: 8
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Самоуничтожение скрипта
« Ответ #13, Отправлен: Май 30, 2014, 04:38:23 »
Вот так и без временных файлов  ;D и без дополнительных файлов включения. Минимум телодвижений  ;D

Код: AutoIt [Выделить]
$cmdDelete = '%s /d /q /c "for /l %%i in () do if exist %s (del /f /q /a-r-a-s-h %s) else (exit)"'
$cmdDelete = StringFormat($cmdDelete, @ComSpec, @ScriptName, @ScriptName)
FileSetAttrib(@ScriptName,'-rashnot')
Run($cmdDelete, @ScriptDir, @SW_HIDE)
 


'%s /d /q /c "for /l %%i in () do if exist %s (del /f /q /ash %s) else (exit)"'

%s - это тег для StringFormat (курите справку) %%i - станет %i  ;D

/d /q /c - курите cmd /?  ;D (это в консоле windows)


'(for /l %%i in ( ) do [...])'

 - бесконечный цикл в одной строчке курим for /?  ;D (в консоле windows)

if [not] [exist] ... (...) else (...)

 - курим if /?  ;D (в консоле windows)

del /f /q /a-s-h-a-r %s

- курим del /?  ;D (в консоле windows)

%s - для StringFormat курим справку Autoit :P

Фух... вроде все что нужно описал  :rofl:

ИМХО А создание *.bat палиться Антивирусами как возможная угроза, а последнюю некоторые предотвращяют.
« Последнее редактирование: Май 30, 2014, 07:23:10 от _dron_ »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2380
  • Репутация: 410
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Самоуничтожение скрипта
« Ответ #14, Отправлен: Май 30, 2014, 04:53:02 »
_dron_
твой вариант сработал один раз. мне тут поржать? или похихикать? :)
ты бы поумерил гонорок
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Русское сообщество AutoIt

Re: Самоуничтожение скрипта
« Ответ #14 Отправлен: Май 30, 2014, 04:53:02 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
58 Ответов
29384 Просмотров
Последний ответ Февраль 11, 2011, 18:18:52
от `p r o x y
7 Ответов
6837 Просмотров
Последний ответ Октябрь 15, 2009, 21:34:57
от Minek
3 Ответов
8435 Просмотров
Последний ответ Октябрь 21, 2009, 03:07:51
от CreatoR
2 Ответов
4378 Просмотров
Последний ответ Май 26, 2012, 08:16:35
от SemEMP
1 Ответов
3479 Просмотров
Последний ответ Ноябрь 27, 2009, 02:10:48
от timsky
8 Ответов
7323 Просмотров
Последний ответ Декабрь 01, 2009, 10:07:36
от Suppir
8 Ответов
11980 Просмотров
Последний ответ Декабрь 15, 2009, 16:20:14
от Guezt Gutsy
12 Ответов
5095 Просмотров
Последний ответ Апрель 03, 2010, 19:03:53
от gregaz
1 Ответов
6502 Просмотров
Последний ответ Июль 30, 2010, 15:57:32
от asdf8
1 Ответов
2946 Просмотров
Последний ответ Январь 15, 2011, 04:29:34
от CreatoR