прости, но в ответе №2 я не нашел ничего касаемо моего скрипта :-[snoitaleR сказал(а):В ответе №2 они обсуждали то, что в твоем скрипте (ответ №7) не учитывается...
чтобы не городить огород ;)Vovsla сказал(а):а почему вы так неохотно пользуетесь дополнительными библиотеками?
Например, если скрипт на выходе делает записи в файлы конфигурации, а при запуске читает их, так вот если запустить скрипт поновой в тот момент пока его первая копия запущена, то он считает старые параметры, а не те что пользователь мог сделать в первой копии запущенного скрипта (программы).для чего тогда Yashied и CreatoR таким "навороченным" способом пытались убедиться, что "родительский" скрипт завершил работу?
Ясно. В любом случае это не так уж и важно как выполнить перезапуск, главное чтобы был надёжный метод, и он есть ;)не на выходе, если хотим выйти
#Include <WinAPIEx.au3>
If MsgBox(36, 'Restarting...', 'Press OK to restart this script.') = 6 Then
Run(@ScriptFullPath)
EndIf
Func OnAutoItStart()
Global $hSemaphore = _WinAPI_CreateSemaphore('MySuperProject', 1, 1)
_WinAPI_WaitForSingleObject($hSemaphore)
EndFunc ;==>OnAutoItStart
Func OnAutoItExit()
_WinAPI_ReleaseSemaphore($hSemaphore)
_WinAPI_FreeHandle($hSemaphore)
EndFunc ;==>OnAutoItExit
snoitaleR сказал(а):А для чего тогда Yashied и CreatoR таким "навороченным" способом пытались убедиться, что "родительский" скрипт завершил работу?
_Singleton('MyProgram')
#Include <Misc.au3>
#Include <WinAPIEx.au3>
_Singleton('MyProgram')
If MsgBox(36, 'Restarting...', 'Press OK to restart this script.') = 6 Then
Run(@ScriptFullPath)
Exit
EndIf
Тот же пример с vbs, но так сказать на чистом AutoIt'еНикаких VBS, BAT, CMD и даже WinAPI, тлько чистый AutoIt.
If MsgBox(36, 'Restarting...', 'Press OK to restart this script.') = 6 Then
_ScriptRestart()
EndIf
Func _ScriptRestart()
Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3"
Local $sRunLine, $sScript_Content, $hFile
$sRunLine = @ScriptFullPath
If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""'
If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw
$sScript_Content &= '#NoTrayIcon' & @CRLF
$sScript_Content &= 'While ProcessExists(' & @AutoItPID & ')' & @CRLF
$sScript_Content &= ' Sleep(10)' & @CRLF
$sScript_Content &= 'WEnd' & @CRLF
$sScript_Content &= 'Run("' & $sRunLine & '")' & @CRLF
$sScript_Content &= 'FileDelete(@ScriptFullPath)' & @CRLF
$hFile = FileOpen($sAutoIt_File, 2)
FileWrite($hFile, $sScript_Content)
FileClose($hFile)
Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE)
Sleep(1000)
Exit
EndFunc
Vovsla сказал(а):итог в ответе 24 не приемлем как библиотека, т.к. в Restart.au3 содержится функция OnAutoItStart() , это делает невозможным использование Restart.au3 как библиотеки когда OnAutoItStart() используется в основном скрипте по причине дублирования названия функций. Из такого решения можно только копировать функции в основной скрипт
Kaster сказал(а):...не важно запущены ли два экземпляра одного и того же скрипта одновременно, т.к. "родительский" после того как запустил "дочерний" неминуемо закроется, не ожидая каких-либо действий со стороны интерпретатора или "дочернего" процесса.
#include <File.au3>
OnAutoItExitRegister("_ScriptReStart")
MsgBox(0, "Перезапуск", "После закрытия через ~10 секунд скрипт опять запуститься")
Func _ScriptReStart()
$sTemp = _TempFile(@TempDir, '~', '.bat')
$sPath = FileGetShortName(@ScriptFullPath)
$hFile = FileOpen($sTemp, 2)
FileWriteLine($hFile, '@echo off')
FileWriteLine($hFile, 'ping -n 10 127.0.0.1 > nul')
FileWriteLine($hFile, 'Start ' & $sPath)
FileWriteLine($hFile, 'Del /F /Q %0')
FileClose($hFile)
Run($sTemp, '', @SW_HIDE)
EndFunc ;==>_ScriptReStart
Так перезапустит только, если скрипта (скомпилированного) нет в процессахА нужен такой способ, чтобы скрипт не был в процессах,
#include <File.au3>
If MsgBox(266276, "Перезапуск", "После закрытия через ~10 секунд" & @CRLF & "скрипт можно перезапустить." & _
@CRLF & @CRLF & "Перезапустить?") = 6 Then _ScriptReStart()
Func _ScriptReStart()
$sTemp = _TempFile(@TempDir, '~', '.bat')
$sPath = FileGetShortName(@ScriptFullPath)
$hFile = FileOpen($sTemp, 2)
FileWriteLine($hFile, '@echo off')
FileWriteLine($hFile, 'chcp 1251 > nul')
FileWriteLine($hFile, ':Again')
FileWriteLine($hFile, 'tasklist /FI "IMAGENAME eq ' & @ScriptName & '"| find "' & @AutoItPID & '"')
FileWriteLine($hFile, 'If %ErrorLevel%==0 GoTo Again')
FileWriteLine($hFile, 'ping -n 10 127.0.0.1 > nul')
FileWriteLine($hFile, 'Start ' & $sPath)
FileWriteLine($hFile, 'Del /F /Q %0')
FileClose($hFile)
Run($sTemp, '', @SW_HIDE)
EndFunc ;==>_ScriptReStart
А так?! ;)перезапуска скрипта после завершения его работы?!
MsgBox(64, "Info", "TEST", 5)
Exit
$dist=(@ScriptFullPath)
Run($dist)
Garrett сказал(а):art279 [?]
А так?! ;)перезапуска скрипта после завершения его работы?!
Код:MsgBox(64, "Info", "TEST", 5) Exit $dist=(@ScriptFullPath) Run($dist)
$dist=(@ScriptFullPath)
Run($dist)
А где в вашем коде завершение работы скрипта?!...методы надёжного перезапуска скрипта после завершения его работы...
Автор темы | Похожие темы | Форум | Ответы | Дата |
---|---|---|---|---|
Э | Надежный метод различать вкладки IE с почти совпадающими заголовками | Общие вопросы по AutoIt | 0 | |
S | Надежный ли это код приема данных? | Общие вопросы по AutoIt | 0 | |
Надежный перезапуск скрипта | UDF - Пользовательские функции | 3 |