-zav- 188 #159936 Posted March 2, 2014 бэкапятся только файлы в самой папке, из вложенных ничего не копируется. Это плохо, мне нужно все вложения.Сделай пожалуйста полностью весь скрипт. Задача: Бэкапить (копировать со всеми вложениями) папку World_of_Tanks\res\scripts\ , например в \res\scripts_backup , прежде проверив имеется ли такая бэкап папка, если имеется то не бэкапим.И самое главное никакие чекбоксы и предупреждения выводить не нужно, пользователю незачем знать это. Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #159975 Posted March 2, 2014 (edited) -zav-, самый простой вариант сделать backup можно вот так: [Files] Source: "{app}\res\scripts\*.*"; DestDir: "{app}\Backup\res\scripts"; Flags: external skipifsourcedoesntexist createallsubdirs recursesubdirs uninsneveruninstall; BeforeInstall: HideInstallPath; Source: "Work\Scripts\*.*"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion recursesubdirs createallsubdirs; BeforeInstall: ShowInstallPath; [UninstallRun] Filename: "xcopy.exe"; Parameters: """{app}\Backup\res\scripts\*.*"" ""{app}\res\scripts\"" /S /E /C /H /R /Y /F"; Flags: runhidden; [UninstallDelete] Type: filesandordirs; Name: "{app}\Backup"; [_____________________Code] procedure HideInstallPath(); begin WizardForm.StatusLabel.Caption:='Создание резервных копий файлов...'; WizardForm.FileNameLabel.Visible:=False; end; procedure ShowInstallPath(); begin WizardForm.FileNameLabel.Visible:=True; WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles); end; Но проверкой тут и не пахнет. Можно сделать через мой пример backup'а, но там проблемы с классами в Unicode-версии Inno Setup - не все файлы копирует из папки-исходника.Если готов использовать ANSI-версию, то сделаю на основе своего примера. #include "SHFileOperation.iss"; #define CUR_DIR "res\scripts" ; #define BAK_DIR "Backup\res\scripts" ; [___________________________________________Code] procedure CurStepChanged(CurStep: TSetupStep); var ThereIsFolders: Boolean; begin ThereIsFolders := (DirExists(AddBackslash(WizardDirValue()) + '{#CUR_DIR}') and (not DirExists(AddBackslash(WizardDirValue()) + '{#BAK_DIR}')) ); if ThereIsFolders then if CurStep=ssInstall then CopyDir(ExpandConstant('{app}\res\scripts\'),ExpandConstant('{app}\Backup\res\scripts')); end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin if CurUninstallStep = usPostUninstall then begin MoveDir(ExpandConstant('{app}\Backup\res\scripts\'),ExpandConstant('{app}\res\scripts')); DelTree(ExpandConstant('{app}\Backup'), True, True, True); end; end; "SHFileOperation.iss" возьмёшь из моего примера на предыдущих станицах. Так будет проверять на наличие папки. Edited March 2, 2014 by AtotIK Quote Share this post Link to post Short link Share on other sites
-zav- 188 #159980 Posted March 2, 2014 (edited) Но проверкой тут и не пахнет. Можно сделать через мой пример backup'а, но там проблемы с классами в Unicode-версии Inno Setup - не все файлы копирует из папки-исходника. Да нет спасибо, нужно именно с проверкой, чтоб не бэкапило второй раз (так как сохраняем оригинальные файлы клиента). Твой пример я использую, но чтоб не было проблем с копированием использую переименование + подстановка даты и время RenameFile(ExpandConstant('{app}\res_mods\'), ExpandConstant('{app}\res_mods-backup-')+GetDateTimeString('dd/mm/yyyy hh:nn', '_', '.' )); end; Но это для папки res_mods , а нужно еще сохранить оригинальные файлы. Edited March 2, 2014 by -zav- Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #159985 Posted March 2, 2014 -zav-, 2-й вариант из моего сообщения выше подходит? Quote Share this post Link to post Short link Share on other sites
-zav- 188 #159992 Posted March 2, 2014 -zav-, 2-й вариант из моего сообщения выше подходит? на вид вроде подходит, но почему то копирование не происходит Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #160102 Posted March 3, 2014 на вид вроде подходит, но почему то копирование не происходит Смотри через F8 выполняется ли кусок кода. Ну или скинь в ЛС скрипт, посмотрю потом. Quote Share this post Link to post Short link Share on other sites
-zav- 188 #160256 Posted March 3, 2014 (edited) Ладно, решил проблему другим способом, просто внес бэкап папку чистых файлов клиента в инсталятор. Я уже давно мучаюсь с этим копированием, похоже оно у меня не работает вообще как таковое. Перепробовал кучу вариантов.Может есть у кого 100% работающий script.iss с копированием папки ? Поделитесь плиз, для тестов. Использую unicode версию Inno Setup Compiler Edited March 3, 2014 by -zav- Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #160268 Posted March 3, 2014 (edited) -zav-, что-нибудь придумаю. Если перейдёшь на ANSI-версию, то все мои примеры заработают. Edited March 3, 2014 by AtotIK Quote Share this post Link to post Short link Share on other sites
-zav- 188 #160272 Posted March 3, 2014 (edited) -zav-, что-нибудь придумаю. Если перейдёшь на ANSI-версию, то все мои примеры заработают. Приложи плиз к своему сообщению свою папку с этой версией, чтоб мне не устанавливать. Но вобще говорят что у unicode вкрсии больше возможностей. . .....Можно даже в личку переходить уже, чтоб не флудить тут. Edited March 3, 2014 by -zav- Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #160275 Posted March 3, 2014 -zav-, вроде смекнул как можно всё сделать, завтра буду колупать код. -zav-, победил. Будет работать на любой версии. #define SourceDir "res\scripts"; #define BackupDir "Backup\res\scripts"; [_______________________________________________Code] procedure CopyFiles(FromPlace, ToPlace: String); var ResultCode: Integer; begin Exec('xcopy.exe', '/E /C /H /R /Y /F /I ' + AddQuotes(FromPlace) + ' ' + AddQuotes(ToPlace), ExpandConstant('{app}'), SW_HIDE, ewWaitUntilTerminated, ResultCode); end; procedure CurStepChanged(CurStep: TSetupStep); var ThereIsFolders: Boolean; begin ThereIsFolders := (DirExists(AddBackslash(WizardDirValue()) + '{#SourceDir}') and (not DirExists(AddBackslash(WizardDirValue()) + '{#BackupDir}')) ); if ThereIsFolders then if CurStep=ssInstall then begin WizardForm.ProgressGauge.Hide; WizardForm.StatusLabel.Caption:='Создание резервных копий файлов...'; CopyFiles(ExpandConstant('{app}') + '\{#SourceDir}\*.*', ExpandConstant('{app}') + '\{#BackupDir}'); WizardForm.ProgressGauge.Show; WizardForm.StatusLabel.Caption:=SetupMessage(msgStatusExtractFiles); end; end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin if CurUninstallStep = usPostUninstall then begin CopyFiles(ExpandConstant('{app}') + '\{#BackupDir}\*.*', ExpandConstant('{app}') + '\{#SourceDir}'); DelTree(ExpandConstant('{app}\Backup'), True, True, True); end; end; Копирование файлов происходит из-под командной строки.З.Ы. Осталось только разобраться с возможностью перемещения. Уже голова не варит сегодня. Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #160402 Posted March 4, 2014 Эх, написал 3 способа "бэкапа" папок, а оказывается нужно было начинать с человеческого фактора. Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #161141 Posted March 7, 2014 Иннот, ну как успехи? Работает метод? Quote Share this post Link to post Short link Share on other sites
MAKS_MAFIA 0 #161166 Posted March 7, 2014 @AtotIK, а ты выложил окончательную версию бэкапа и удаление модов? Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #161169 Posted March 7, 2014 MAKS_MAFIA, смотря что надо. Вообще тут можно собрать трансформер из способов, которые я тут постил. Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #161207 Posted March 7, 2014 (edited) @AtotIK, а возможно сделать возможность отладки, что-ли? (ссори за тавтологию) Чтобы каждое действие, которое выполняет инсталлятор в ходе установки записывалось, например, в *.ini документ? Edited March 7, 2014 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #161942 Posted March 11, 2014 (edited) Kotyarko_O, в принципе можно. Поковыряюсь как-нибудь. Поподробнее напиши как ты это видишь. Edited March 11, 2014 by AtotIK Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #161947 Posted March 11, 2014 (edited) @AtotIK, просто список со всеми выполненными событиями, всё, что делал инсталлятор при установке, примерно так: (время; [файл1, над которым проделывалась операция]; "путь1, по которому он распаковывался"); (время; [файл2, над которым проделывалась операция]; "путь2, по которому он распаковывался"); (время; [файл3, над которым проделывалась операция]; "путь3, по которому он распаковывался"); и т.д. Если возникает какая-то ошибка - её так же записывать Edited March 11, 2014 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
KillerBot611 0 #162891 Posted March 16, 2014 Я хочу изменить начальный путь установки, чтобы при запуске модпака изначально предлагалась другой путь установки. Как мне это сделать? Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #162893 Posted March 16, 2014 Я хочу изменить начальный путь установки, чтобы при запуске модпака изначально предлагалась другой путь установки. Как мне это сделать? Вот скрипт, определяющий по ветке реестра путь к игре: 'скрипт' [Setup] DefaultDirName={code:GetInstallDir} [Code] Function GetInstallDir(Path: String ): String; var InsPath: String; er: boolean; myFile:String; begin Result:= Path; begin Result:=ExpandConstant('C:\Games\World_of_Tanks\'); er := RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', InsPath); if er and (InsPath<>'') then begin Result := InsPath; end; end; end; Result:=ExpandConstant('C:\Games\World_of_Tanks\'); - это путь, который будет предлагаться, если по реестру игру не удалось найти. Его и изменяй, как тебе удобно. Это имел ввиду? 1 Quote Share this post Link to post Short link Share on other sites
KillerBot611 0 #162896 Posted March 16, 2014 (edited) Вот скрипт, определяющий по ветке реестра путь к игре: 'скрипт' [Setup] DefaultDirName={code:GetInstallDir} [Code] Function GetInstallDir(Path: String ): String; var InsPath: String; er: boolean; myFile:String; begin Result:= Path; begin Result:=ExpandConstant('C:\Games\World_of_Tanks\'); er := RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', InsPath); if er and (InsPath<>'') then begin Result := InsPath; end; end; end; Result:=ExpandConstant('C:\Games\World_of_Tanks\'); - это путь, который будет предлагаться, если по реестру игру не удалось найти. Его и изменяй, как тебе удобно. Это имел ввиду? Да, это оно, спасибо) В тенчики я играл очень долго. Забросил игру, и начал играть в Minecraft. Решил сделать модпак по этой игре. Окей, я только-что узнал, что есть проверка по реестру. Так вот, если эта игра устанавливается только в одной папке, по этому пути C:\Users\########\AppData\Roaming\.minecraft, как убрать проверку по реестру? Edited March 16, 2014 by KillerBot611 Quote Share this post Link to post Short link Share on other sites