- Сообщения
- 5,379
- Репутация
- 2,724
Написал функцию для перезапуска скрипта. Функция может быть вызвана в любом месте кода. Работает так: создает в Temp папке VBS скрипт (изучаем это), затем запускает его и завершает программу. В свою очередь, VBS скрипт ждет завершения основной программы, после чего запускает ее снова и удаляет сам себя. Одно НО, название файла основной программы должно быть "уникальным", т.е. в списке процессов не должно быть таких же названий.
Код:
#Include <File.au3>
If MsgBox(36, 'Restarting...', 'Press OK to restart this script.') = 6 Then
_ScriptRestart()
EndIf
Func _ScriptRestart()
$sVbs = _TempFile(@TempDir, '~', '.vbs')
$hFile = FileOpen($sVbs, 2)
FileWriteLine($hFile, 'Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")')
FileWriteLine($hFile, 'Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")')
FileWriteLine($hFile, 'Set colItems = objRefresher.AddEnum(objService, "Win32_Process").objectSet')
FileWriteLine($hFile, 'Do Until False')
FileWriteLine($hFile, ' WScript.Sleep 500')
FileWriteLine($hFile, ' objRefresher.Refresh')
FileWriteLine($hFile, ' Flag = True')
FileWriteLine($hFile, ' For Each objItem in colItems')
FileWriteLine($hFile, ' If objItem.ProcessID = ' & @AutoItPID & ' Then')
FileWriteLine($hFile, ' Flag = False')
FileWriteLine($hFile, ' End If')
FileWriteLine($hFile, ' Next')
FileWriteLine($hFile, ' If Flag = True Then')
FileWriteLine($hFile, ' Exit Do')
FileWriteLine($hFile, ' End If')
FileWriteLine($hFile, 'Loop')
FileWriteLine($hFile, 'Set objShell = CreateObject("WScript.Shell")')
FileWriteLine($hFile, 'objShell.Run("' & FileGetShortName(@ScriptFullPath) & '")')
FileWriteLine($hFile, 'Set objFSO = CreateObject("Scripting.FileSystemObject")')
FileWriteLine($hFile, 'Set File = objFSO.GetFile("' & FileGetShortName($sVbs) & '")')
FileWriteLine($hFile, 'File.Delete')
FileClose($hFile)
ShellExecute($sVbs)
Exit
EndFunc ;==>_ScriptRestart