|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Ошибка при отработке скрипта с самоудалением |
|
[решено] Ошибка при отработке скрипта с самоудалением
|
Ветеран Сообщения: 903 |
Профиль | Отправить PM | Цитировать
Собственно, проблема:
При отработке скрипта с самоудалением и последующей перезагрузкой возникает ошибка ( cmd.exe "Ошибка при инициализации приложения (0x0000142).....). В результате файл не удаляется. код: ;Предотвращение появление процесса-клона If WinExists(@ScriptName) Then Exit AutoItWinSetTitle(@ScriptName) ;Блокирование ПК #NoTrayIcon #include <BlockInputEx.au3> Opt("WinWaitDelay", 1) $sTaskMgr_Title = "[CLASS:#32770;REGEXPTITLE:(Диспетчер задач|Task Manager)]" ;Disable Task Manager RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "1") _BlockInputEx(1) $iPID = Run(@COMSPEC & ' /c %SYSTEMDRIVE%\cleanup.cmd', "", @SW_HIDE) While ProcessExists($iPID) $Title = "Пожалуйста, подождите..." ; Заголовок $SubTitle = "Происходит финализация установки" ; Суб-заголовок $Message = "После удаления мусора, оставшегося от установки" & @CRLF ; Сообщение. Записано в таком виде для удобства $Message &= "XP и создания/перемещения ярлыков, Система" & @CRLF $Message &= "будет перезагружена. Осталось времени: " $Time = 35 * 1000 ; Время здесь хранится в миллескундах. 1 с = 1000 мс $Sleep = 0.01 * 100000 ; 10 мс. Меньше 1 мс ставить не рекомундуется. Впрочем, тут и 100 мс хватает. $Timer = TimerInit() ; Инициализация таймера. ProgressOn($Title, $SubTitle, $Message & $Time) ; Параметры: заголовок, суб-заголовок, сообщение. Включаем окно прогресса. While TimerDiff($Timer) < $Time ; Пока прошло времени меньше чем нужно - повторять: ProgressSet(TimerDiff($Timer) / $Time * 100, $Message & Round(($Time - TimerDiff($Timer)) / 1000, 0) & " секунд") ; ProgressSet ( percent [, "subtext" [, "maintext"]] ) ; Параметр 1: процент прогресса. Прошедшее время делим на требуемое и умножаем на 100 ; Параметр 2: сообщение. Стандартное, как в перменной $Message плюс оставшееся время округлённое до целых ; Параметр 3: опциональный. Здесь не используется. Sleep($Sleep); Подожать $Sleep мс WEnd WEnd ProgressSet(100, "ПЕРЕЗАГРУЗКА! УДАЧНОЙ РАБОТЫ!") ; Выводим последнее сообщение. Sleep(3000) ; Чтобы было видно последнее сообщение. ;Enable Task Manager back RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "0") ; Функция самоудалениея скрипта #Include <File.au3> Func _ScriptDestroy() $sTemp = _TempFile(@TempDir, '~', '.bat') $sPath = FileGetShortName(@ScriptFullPath) $hFile = FileOpen($sTemp, 2) FileWriteLine($hFile, '@echo 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() Shutdown(2) ; Перезагружаем компьютер |
|
Отправлено: 01:56, 06-07-2010 |
Ветеран Сообщения: 903
|
Профиль | Отправить PM | Цитировать Применение скрипта без последней функции на самоуничтожение приводит к исчезновению ошибки. Что я неправильно в ней сделал?
код: ; Функция самоудалениея скрипта #Include <File.au3> Func _ScriptDestroy() $sTemp = _TempFile(@TempDir, '~', '.bat') $sPath = FileGetShortName(@ScriptFullPath) $hFile = FileOpen($sTemp, 2) FileWriteLine($hFile, '@echo 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() |
------- Отправлено: 11:54, 07-07-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать saavaage,
По-моему, Вы одновременно запускаете и перезагрузку, и батник самоудаления, из-за чего возникает ошибка. |
Отправлено: 13:47, 07-07-2010 | #3 |
Ветеран Сообщения: 903
|
Профиль | Отправить PM | Цитировать madmasles, вы правы. Закоментировал строку с shoutdown и все прошло успешно. Вопрос тогда - как сдеелать, чтобы не было одновременного старта этих двух процессов. Вроде в скрипте (шапка) они идут последовательно (я предполагал, что shoutdown должен дождаться выполнения _ScriptDestroy() )...
PS Может есть параметр, который заставляет дождаться выполнения одной команды перед стартом другой? |
------- Последний раз редактировалось saavaage, 07-07-2010 в 14:27. Отправлено: 14:04, 07-07-2010 | #4 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать saavaage,
А может из батника удаления запустить перезагрузку? |
|
Отправлено: 14:51, 07-07-2010 | #5 |
Ветеран Сообщения: 903
|
Профиль | Отправить PM | Цитировать madmasles, как в него передать эту команду. Autoit это может?
PS Вы же имеете в виду батник, который создается функцией _ScriptDestroy()? |
------- Отправлено: 14:57, 07-07-2010 | #6 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать Цитата saavaage:
У меня так работает, несколько раз проверил: #Include <File.au3> _ScriptDestroy() Func _ScriptDestroy() $sTemp = _TempFile(@TempDir, '~', '.bat') $sPath = FileGetShortName(@ScriptFullPath) $hFile = FileOpen($sTemp, 2) FileWriteLine($hFile, '@echo off') FileWriteLine($hFile, ':loop') FileWriteLine($hFile, 'del ' & $sPath) FileWriteLine($hFile, 'if exist ' & $sPath & ' goto loop') FileWriteLine($hFile, 'shutdown -r -f -t 5') FileWriteLine($hFile, 'del ' & $sTemp) FileClose($hFile) Run($sTemp, '', @SW_HIDE) EndFunc ;==>_ScriptDestroy |
|
Отправлено: 15:09, 07-07-2010 | #7 |
Ветеран Сообщения: 903
|
Профиль | Отправить PM | Цитировать madmasles, прекрасно сработало. Спасибо огромное. Тему можно закрывать.
PS Напоследок - не знаете, как отключить окно с предупреждением о перезагрузки? Читал справку по команде, не нашел никакого параметра (если только убрать t) , отвечающего за непоказ окна предупреждения о перезагрузке... |
------- Отправлено: 15:24, 07-07-2010 | #8 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать |
Отправлено: 15:39, 07-07-2010 | #9 |
Ветеран Сообщения: 903
|
Профиль | Отправить PM | Цитировать madmasles, а я просто подправил таким образом:
shutdown -r -f -t 0, т.е. поставил задержку, равную 0 и окно исчезло. Однако, Ваш последний вариант больше, имхо, в духе autoit PS Думаю форсировать перезагрузку смысла нет, поставил в конце shutdown(2). |
------- Последний раз редактировалось saavaage, 07-07-2010 в 21:00. Отправлено: 15:44, 07-07-2010 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Обработка ключей запуска CMD- файла | volk1234 | Скриптовые языки администрирования Windows | 28 | 20-12-2009 21:46 | |
CMD/BAT - [решено] Помогите запустить CMD-файл из CMD-файла с параметрами | Oleg48 | Скриптовые языки администрирования Windows | 2 | 18-11-2009 11:08 | |
CMD/BAT - [решено] Вызов одного пакетного файла из другого | Solitude | Скриптовые языки администрирования Windows | 2 | 24-02-2009 18:47 | |
CMD/BAT - Небольшая проблемка с кодом CMD-файла | nightmare95 | Скриптовые языки администрирования Windows | 8 | 26-11-2008 16:17 | |
Помогите пожалуйста не срабатывает команда из*cmd файла запускаемого из RanOnceEx.cmd | vovchiku | Автоматическая установка Windows 2000/XP/2003 | 6 | 25-09-2007 23:38 |
|