SLasH
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: ' @appName cmd ' @author Ciber SLasH ' @ver 0.01 ' @cDate 05.06.2014 ' @mDate '/////////////////////////////////////////////////////////////////////////////// '==[ Описание работы ]========================================================== '/////////////////////////////////////////////////////////////////////////////// ' 1. Перед запуском приложения анализируется папка ' "%UserProfile%\AppData\Local\ChemTable Software" и если она существует, то она ' бэкапится в песочницу по пути "<SnadboxPath>\_Backup" ' 2. Удаляется папка "%UserProfile%\AppData\Local\ChemTable Software" ' 3. Прописывается скрипт в автозагрузку. В раздел ' [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce] ' "Temp"="<путь к скрипту>" ' <путь к скрипту> = %TEMP%\<имя приложения>_afterReboot.vbs ' Далее предпологается, что приложение сделало свои дела и ОС перезагрузили. ' После перезагрузки запускается скрипт, который делает следующее: ' 1. Уадаляет папку "%UserProfile%\AppData\Local\ChemTable Software" ' 2. Восстанавливает из бэкапа то, что было в папке ' "%UserProfile%\AppData\Local\ChemTable Software" перед работой приложения '/////////////////////////////////////////////////////////////////////////////// const DEBUG = 1 'Dim APP_NAME: APP_NAME = GetBuildOption("InventoryName") Dim APP_NAME: APP_NAME = "cmd" Dim SCRIPT_NAME: SCRIPT_NAME = "script.vbs" Dim SCRIPT_EXT_NAME: SCRIPT_EXT_NAME = "ThinApp :: " & APP_NAME & " -> " & SCRIPT_NAME Dim FSO: Set FSO = CreateObject("Scripting.filesystemObject") const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim WORK_DIR_SUB_PATH: WORK_DIR_SUB_PATH = GetEnvironmentVariable("UserProfile") & "\AppData\Local" Dim WORK_DIR: WORK_DIR = WORK_DIR_SUB_PATH & "\ChemTable Software" Dim TMP_DIR: TMP_DIR = ExpandPath("%TEMP%") ' Скрипт, который будет запущен после перезагрузки Dim SCRIPT_PATH: SCRIPT_PATH = TMP_DIR &"\"& APP_NAME &"_afterReboot.vbs" ' Внешний regedit.exe Dim REGEDIT_EXTERNAL: REGEDIT_EXTERNAL = chr(34) & ExpandPath("%SystemRoot%\regedit.exe") & chr(34) '------------------------------------------------------------------------------- '--[ Выполняется при запуске ]-------------------------------------------------- '------------------------------------------------------------------------------- Function OnFirstSandboxOwner const FUNC_NAME = "OnFirstSandboxOwner" ' Полный путь к запущенному exe-шнику проекта. ' Пример: D:\Soft\Utils\_Portable\VMware ThinApp\Captures\cmd_1\bin\cmd.exe Dim Origin: Origin = GetEnvironmentVariable("TS_ORIGIN") ' Путь к приложению, имя приложения, путь к песочнице Dim SourcePath, ExeName, SandboxPath ' LastSlash = позиция последнего backslash-а в Origin LastSlash = InStrRev(Origin, "\") ' SourcePath = путь из Origin без последнего backslash-а (путь к запущенному exe-шнику) SourcePath = Left(Origin, LastSlash) ' ExeName = имя exe-шника ExeName = Mid(Origin, LastSlash + 1) SandboxParent = GetBuildOption("SandboxPath") SandboxName = GetBuildOption("SandboxName") If SandboxParent = "." Then SandboxPath = SourcePath & SandboxName Else SandboxPath = SandboxParent & "\" & SandboxName End If On Error Resume Next Dim BACKUP_PATH: BACKUP_PATH = SandboxPath & "\_Backup" ' Очищаем бэкап If FSO.FolderExists(BACKUP_PATH) Then FSO.DeleteFolder(BACKUP_PATH) End If ' Бэкап "WORK_DIR" в песочницу If FSO.FolderExists(WORK_DIR) Then ' Копируем папку изнутри в песочницу ret = CopyFolderExternal(WORK_DIR, BACKUP_PATH) If ret <> 0 Then If DEBUG Then Call MsgBox( _ "Function: " & FUNC_NAME & vbNewLine & _ "SubFunction: CopyFileExternal" & vbNewLine & _ "SubFunction ReturnCode: " & ret & vbNewLine & _ "--" & vbNewLine & _ "Критическая ошибка, выполнение функции прервано !" _ , vbOKOnly + vbCritical, "[ERROR] " & SCRIPT_EXT_NAME _ ) End If Exit Function End If ' Удаление "WORK_DIR" FSO.DeleteFolder(WORK_DIR) End If ' Наполняем скрипт Set f = FSO.OpenTextFile(SCRIPT_PATH, ForWriting, true) f.WriteLine("Set FSO = CreateObject(""Scripting.filesystemObject"")") f.WriteLine("On Error Resume Next") ' Удаляем "WORK_DIR" f.WriteLine("FSO.DeleteFolder("""& WORK_DIR &""")") ' Восстанавливаем "WORK_DIR" из бэкапа f.WriteLine("FSO.CopyFolder """& BACKUP_PATH &""", """& WORK_DIR_SUB_PATH &""", true") ' Удаляем наш скрипт f.WriteLine("FSO.DeleteFile(WScript.ScriptFullName)") f.Close ' Прописываем скрипт в автозагрузку Dim TMP_REG: TMP_REG = TMP_DIR &"\"& APP_NAME & ".tmp" Set f = FSO.OpenTextFile(TMP_REG, ForWriting, true, -1) f.WriteLine("Windows Registry Editor Version 5.00") f.WriteLine f.WriteLine("[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce]") SP = Replace(SCRIPT_PATH, "\", "\\") SP = "\"&chr(34) & SP & "\"&chr(34) f.WriteLine("""Temp""="""& SP & """") f.Close cmd = REGEDIT_EXTERNAL & " /S " &chr(34)& TMP_REG &chr(34) Call WaitForProcess(ExecuteExternalProcess(cmd), 0) FSO.DeleteFile(TMP_REG) ' Ниже можно вставить другие необходимые действия End Function '/////////////////////////////////////////////////////////////////////////////// '==[ Доп. функции ]============================================================= '/////////////////////////////////////////////////////////////////////////////// '--[ Копирование папки ]-------------------------------------------------------- ' @param1 - исходный путь к папке ' @param2 - путь назначения, куда будет копироваться исходная папка ' @retrun - значение ошибки (0 - ошибок нет) Function CopyFolderExternal(src, dst) const FUNC_NAME = "CopyFolderExternal" Dim dstName On Error Resume Next ' Проверка существования папки If Not FSO.FolderExists(src) Then If DEBUG Then Call MsgBox( _ "Function: "&FUNC_NAME&"::FolderExists" & vbNewLine & _ "args[0]: " & src & vbNewLine & _ "--" & vbNewLine & _ "Err.Number: " & Err.Number & vbNewLine & _ "Err.Description: " & Err.Description _ , vbOKOnly + vbCritical, "[ERROR] " & SCRIPT_EXT_NAME _ ) End If Err.Clear CopyFolderExternal = -1 Exit Function End If ' Добавляем "\" в конец пути назначения, если нет backslash-а If Not (Right(dst, 1) = "\") Then dstName = dst & "\" End If ' Проверка существования папки назначения If Not FSO.FolderExists(dst) Then ' Если нет папки назначения, то создаём её FSO.CreateFolder(dst) If Err.Number <> 0 Then If DEBUG Then Call MsgBox( _ "Function: "&FUNC_NAME&"::CreateFolder" & vbNewLine & _ "args[0]: " & dst & vbNewLine & _ "--" & vbNewLine & _ "Err.Number: " & Err.Number & vbNewLine & _ "Err: " & Err.Description _ , vbOKOnly + vbCritical, "[ERROR] " & SCRIPT_EXT_NAME _ ) End If Err.Clear CopyFolderExternal = -2 Exit Function End If End If ' Копируем исходную папку в папку назначения FSO.CopyFolder src, dstName, true If Err.Number <> 0 Then If DEBUG Then Call MsgBox( _ "Function: "&FUNC_NAME&"::CopyFolder" & vbNewLine & _ "args[0]: " & src & vbNewLine & _ "args[1]: " & dstName & vbNewLine & _ "--" & vbNewLine & _ "Err.Number: " & Err.Number & vbNewLine & _ "Err: " & Err.Description _ , vbOKOnly + vbCritical, "[ERROR] " & SCRIPT_EXT_NAME _ ) End If CopyFolderExternal = -3 Err.Clear Exit Function End If CopyFolderExternal = 0 End Function |
| Всего записей: 723 | Зарегистр. 08-10-2002 | Отправлено: 22:47 05-06-2014 | Исправлено: SLasH, 22:48 05-06-2014 |
|