Что нового

Самоликвидация скрипта

pashkovka

Новичок
Сообщения
18
Репутация
0
Создан скрипт автоматизация добавления учётной записи в Thunderbird.
Теперь хочу сделать так - чтобы он автоматически удалялся после выполнения.
Вот мой исходник
Код:
#RequireAdmin
BlockInput(1)
Run("c:\program files\mozilla thunderbird\thunderbird.exe")
Sleep(2000); Необходимо изменить в зависимости от скорости открытия
Send("{ALT}")
Sleep(1000) 
Send("{ENTER}")
Sleep(1000) 
Send("{ENTER}")
Sleep(1000) 
Send("{UP}")
Sleep(400)
Send("{UP}")
Sleep(400)
Send("{UP}")
Sleep(1000) 
Send("{ENTER}")
Sleep(1000) 
SEND("ИМЯ Почты")
Sleep(1000) 
Send("{TAB}")
Sleep(1000) 
SEND("[email protected]")
Sleep(1000)
Send("{TAB}")
Sleep(1000) 
SEND("ввод пароля на ящик")
Sleep(1000)
Send("{TAB}")
Sleep(1000) 
Send("{TAB}")
Sleep(1000) 
Send("{ENTER}")
Sleep(2000) ; Идёт процесс проверки
Send("{TAB}")
Sleep(1000) 
Send("{TAB}")
Sleep(1000) 
Send("{TAB}")
Sleep(1000) 
Send("{TAB}")
Sleep(1000) 
Send("{TAB}")
Sleep(1000) 
Send("{TAB}")
Sleep(1000) 
Send("{TAB}")
Sleep(1000) 
Send("{RIGHT}")
Sleep(1000) 
Send("{TAB}")
Sleep(1000) 
Send("{TAB}")
Sleep(1000)
Send("{ENTER}") ; Финиш, должен создаться профиль
BlockInput(0)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
pashkovka,
Точно знаю, что есть на форуме, но лень искать. :smile:
Код:
_ScriptDestroy()
MsgBox(0, '', 'Прощайте...', 5)

Func _ScriptDestroy()
	Local $s_TempFile, $h_File, $s_Path = FileGetShortName(@ScriptFullPath), _
			$s_TextCmd = ':loop' & @CRLF & 'del ' & $s_Path & ' /q' & @CRLF & _
			'if exist ' & $s_Path & ' goto loop' & @CRLF & 'del %0'
	Do
		$s_TempFile = ''
		For $i = 1 To 3
			$s_TempFile &= Chr(Random(48, 57, 1))
		Next
		$s_TempFile = @TempDir & '\~' & $s_TempFile & '.bat'
	Until Not FileExists($s_TempFile)
	$h_File = FileOpen($s_TempFile, 2)
	FileWrite($h_File, $s_TextCmd)
	FileClose($h_File)
	Run($s_TempFile, '', @SW_HIDE)
EndFunc   ;==>_ScriptDestroy
 
Автор
P

pashkovka

Новичок
Сообщения
18
Репутация
0
Код:
ShellExecute('cmd.exe', '/k del "' & @ScriptFullPath & '"', '', '', @SW_HIDE)

Это то что нужно! :rofl:
Кто нибудь знает, AutoIt делает резервные копии? :blink:
Фуух! Спасибо форуму что сохранил исходник! :IL_AutoIt_1: :laugh:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
OffTopic:
madmasles [?]
Точно знаю, что есть на форуме, но лень искать
Плохой пример подаёте, особенно в лице модератора и AutoIt Гуру ;)
 

gora

Знающий
Сообщения
315
Репутация
19
madmasles
Объясните, пожалуйста:
- зачем нужно короткое имя ?
- зачем нужна строка @echo off, если батник запускается в скрытом режиме?
- почему в команде Del нет ключа /Q ?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
gora,
1. У меня с длинным путем, если в нем есть русские буквы, не удаляет.
2. Случайно осталась.
3. И без ключа /Q у меня удаляет и ничего не спрашивает, наверное, если добавить, хуже не будет.
 

gora

Знающий
Сообщения
315
Репутация
19
madmasles [?]
с длинным путем, если в нем есть русские буквы, не удаляет
У меня вот так удаляет с длинными путями, пробелами и кириллицей:
Код:
Local $s_TempFile, $h_File, _
            $s_TextCmd = ':loop' & @CRLF & 'del "%~1" /q & if exist "%~1" (goto loop) Else del "%~0" /q'
...
    Run('"' & $s_TempFile & '" "' & @ScriptFullPath & '"', '', @SW_HIDE)
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
pashkovka
Скрипт, конечно, примитив полный. Попробуйте использовать ControlSend, иногда SendKeepActive для Send, тогда не придётся ждать 25 сек работы скрипта, а выполнится мгновенно. И клавиатуру с мышей не придётся блокировать. WinWait - ожидание окна после Run, взамен Sleep. Читай в справке

А если файл на неперезаписываемом устройстве? Не будет ли "goto loop" источником бесконечного цикла?
 

gora

Знающий
Сообщения
315
Репутация
19
AZJIO [?]
А если файл на неперезаписываемом устройстве? Не будет ли "goto loop" источником бесконечного цикла?
Думаю, будет, но... Ведь скрипт предназначен для выполнения "реальной" задачи, а "удаление с неперезаписываемого носителя" ни как таковой не назовешь.
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
gora
Ведь скрипт предназначен для выполнения "реальной" задачи, а "удаление с неперезаписываемого носителя" ни как таковой не назовешь.
Это до поры до времени. На флешках есть переключатель делающий данные доступными только для чтения. При использовании с CD (кто бы мог подумать) тоже самое. Сам использую скрипты на LiveCD для автоматизации и это частая ошибка программ, которые не намечались для использования таким способом, а при случае начинают глючить. Желательно 10-100 итераций и выход в любом случае.
 

gora

Знающий
Сообщения
315
Репутация
19
AZJIO
Я не думаю, что в этом случае нужно усложнять батник. Достаточно в AutiIt скрипте сделать проверку на "неперезаписываемость" диска со скриптом и просто не запускать функцию самоудаления.
 

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Вот еще вариант без цикла в батнике:
Код:
#include <file.au3>
FileCopy (@ScriptFullPath, @ScriptFullPath&'.backup', 1) ; делаем запасную копию, чтобы не вcпоминать потом свои труды :)

$tmp = StringTrimRight (_TempFile(), 3)&'bat'
$process = StringSplit(@AutoItExe, '\')
FileWriteLine ($tmp, 'taskkill /F /IM '&$process[$process[0]]&'')
FileWriteLine ($tmp, 'del /f /q "'&FileGetShortName(@ScriptFullPath)&'"')
FileWriteLine ($tmp, 'del /f /q "'&$tmp&'"')

ConsoleWrite ('----'&@CRLF&FileRead($tmp)&'----'&@CRLF) ; проверяем содержимое батника
RunWait ($tmp, '', @SW_HIDE)
Sleep(2500)

Код:
FileGetShortName(@ScriptFullPath)
- лучше все-таки использовать сокращенные имена. У меня только так работает с кириллицей и пробелами в пути.
 

gora

Знающий
Сообщения
315
Репутация
19
Pelerin [?]
У меня только так работает с кириллицей и пробелами в пути.
Потому-что Вы пишите путь и имя в тело батника, а я не пишу, передавая путь в виде переменной.
 
Верх