Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Ошибка при отработке скрипта с самоудалением

Ответить
Настройки темы
[решено] Ошибка при отработке скрипта с самоудалением

Ветеран


Сообщения: 903
Благодарности: 161


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: saavaage
Дата: 03-08-2010
Собственно, проблема:

При отработке скрипта с самоудалением и последующей перезагрузкой возникает ошибка ( 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) ; Перезагружаем компьютер
На всякий случай прикрепляю файл самого скрипта и cmd-файл, который из него запускается

Отправлено: 01:56, 06-07-2010

 

Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить 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()
PS Если просто создать отдельный скрипт с этой функцией ( ScriptDestroy() ), то тоже все отрабатывает нормально и файл успешно самоудаляется. Применение же в составе скрипта в шапке влечет за собой ошибку..

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 11:54, 07-07-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


saavaage,
По-моему, Вы одновременно запускаете и перезагрузку, и батник самоудаления, из-за чего возникает ошибка.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:47, 07-07-2010 | #3


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


madmasles, вы правы. Закоментировал строку с shoutdown и все прошло успешно. Вопрос тогда - как сдеелать, чтобы не было одновременного старта этих двух процессов. Вроде в скрипте (шапка) они идут последовательно (я предполагал, что shoutdown должен дождаться выполнения _ScriptDestroy() )...

PS Может есть параметр, который заставляет дождаться выполнения одной команды перед стартом другой?

-------
мы рождены, чтоб сказку сделать былью


Последний раз редактировалось saavaage, 07-07-2010 в 14:27.


Отправлено: 14:04, 07-07-2010 | #4


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


saavaage,
А может из батника удаления запустить перезагрузку?

Отправлено: 14:51, 07-07-2010 | #5


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


madmasles, как в него передать эту команду. Autoit это может?

PS Вы же имеете в виду батник, который создается функцией _ScriptDestroy()?

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 14:57, 07-07-2010 | #6


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Цитата saavaage:
Вы же имеете в виду батник, который создается функцией _ScriptDestroy()? »
Да в него.
У меня так работает, несколько раз проверил:
Код: Выделить весь код
#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
Благодарности: 161

Профиль | Отправить PM | Цитировать


madmasles, прекрасно сработало. Спасибо огромное. Тему можно закрывать.

PS Напоследок - не знаете, как отключить окно с предупреждением о перезагрузки? Читал справку по команде, не нашел никакого параметра (если только убрать t) , отвечающего за непоказ окна предупреждения о перезагрузке...

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 15:24, 07-07-2010 | #8


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


saavaage,
Сейчас проверил, так срабатывает без всяких окон:
Код: Выделить весь код
_ScriptDestroy()
Sleep(1000)
Shutdown(6)
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:39, 07-07-2010 | #9


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


madmasles, а я просто подправил таким образом:
shutdown -r -f -t 0,
т.е. поставил задержку, равную 0 и окно исчезло. Однако, Ваш последний вариант больше, имхо, в духе autoit
PS Думаю форсировать перезагрузку смысла нет, поставил в конце shutdown(2).

-------
мы рождены, чтоб сказку сделать былью


Последний раз редактировалось saavaage, 07-07-2010 в 21:00.


Отправлено: 15:44, 07-07-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Ошибка при отработке скрипта с самоудалением

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход