-zav- Posted March 2, 2014 Share Posted March 2, 2014 бэкапятся только файлы в самой папке, из вложенных ничего не копируется. Это плохо, мне нужно все вложения.Сделай пожалуйста полностью весь скрипт. Задача: Бэкапить (копировать со всеми вложениями) папку World_of_Tanks\res\scripts\ , например в \res\scripts_backup , прежде проверив имеется ли такая бэкап папка, если имеется то не бэкапим.И самое главное никакие чекбоксы и предупреждения выводить не нужно, пользователю незачем знать это. @ Quote Link to comment Short link Share on other sites More sharing options...
AtotIK Posted March 2, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
-zav- Posted March 2, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
AtotIK Posted March 2, 2014 Share Posted March 2, 2014 -zav-, 2-й вариант из моего сообщения выше подходит? @ Quote Link to comment Short link Share on other sites More sharing options...
-zav- Posted March 2, 2014 Share Posted March 2, 2014 -zav-, 2-й вариант из моего сообщения выше подходит? на вид вроде подходит, но почему то копирование не происходит @ Quote Link to comment Short link Share on other sites More sharing options...
AtotIK Posted March 3, 2014 Share Posted March 3, 2014 на вид вроде подходит, но почему то копирование не происходит Смотри через F8 выполняется ли кусок кода. Ну или скинь в ЛС скрипт, посмотрю потом. @ Quote Link to comment Short link Share on other sites More sharing options...
-zav- Posted March 3, 2014 Share Posted March 3, 2014 (edited) Ладно, решил проблему другим способом, просто внес бэкап папку чистых файлов клиента в инсталятор. Я уже давно мучаюсь с этим копированием, похоже оно у меня не работает вообще как таковое. Перепробовал кучу вариантов.Может есть у кого 100% работающий script.iss с копированием папки ? Поделитесь плиз, для тестов. Использую unicode версию Inno Setup Compiler Edited March 3, 2014 by -zav- @ Quote Link to comment Short link Share on other sites More sharing options...
AtotIK Posted March 3, 2014 Share Posted March 3, 2014 (edited) -zav-, что-нибудь придумаю. Если перейдёшь на ANSI-версию, то все мои примеры заработают. Edited March 3, 2014 by AtotIK @ Quote Link to comment Short link Share on other sites More sharing options...
-zav- Posted March 3, 2014 Share Posted March 3, 2014 (edited) -zav-, что-нибудь придумаю. Если перейдёшь на ANSI-версию, то все мои примеры заработают. Приложи плиз к своему сообщению свою папку с этой версией, чтоб мне не устанавливать. Но вобще говорят что у unicode вкрсии больше возможностей. . .....Можно даже в личку переходить уже, чтоб не флудить тут. Edited March 3, 2014 by -zav- @ Quote Link to comment Short link Share on other sites More sharing options...
AtotIK Posted March 3, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
AtotIK Posted March 4, 2014 Share Posted March 4, 2014 Эх, написал 3 способа "бэкапа" папок, а оказывается нужно было начинать с человеческого фактора. @ Quote Link to comment Short link Share on other sites More sharing options...
AtotIK Posted March 7, 2014 Share Posted March 7, 2014 Иннот, ну как успехи? Работает метод? @ Quote Link to comment Short link Share on other sites More sharing options...
MAKS_MAFIA Posted March 7, 2014 Share Posted March 7, 2014 @AtotIK, а ты выложил окончательную версию бэкапа и удаление модов? @ Quote Link to comment Short link Share on other sites More sharing options...
AtotIK Posted March 7, 2014 Share Posted March 7, 2014 MAKS_MAFIA, смотря что надо. Вообще тут можно собрать трансформер из способов, которые я тут постил. @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted March 7, 2014 Share Posted March 7, 2014 (edited) @AtotIK, а возможно сделать возможность отладки, что-ли? (ссори за тавтологию) Чтобы каждое действие, которое выполняет инсталлятор в ходе установки записывалось, например, в *.ini документ? Edited March 7, 2014 by Kotyarko_O @ Quote Link to comment Short link Share on other sites More sharing options...
AtotIK Posted March 11, 2014 Share Posted March 11, 2014 (edited) Kotyarko_O, в принципе можно. Поковыряюсь как-нибудь. Поподробнее напиши как ты это видишь. Edited March 11, 2014 by AtotIK @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted March 11, 2014 Share Posted March 11, 2014 (edited) @AtotIK, просто список со всеми выполненными событиями, всё, что делал инсталлятор при установке, примерно так: (время; [файл1, над которым проделывалась операция]; "путь1, по которому он распаковывался"); (время; [файл2, над которым проделывалась операция]; "путь2, по которому он распаковывался"); (время; [файл3, над которым проделывалась операция]; "путь3, по которому он распаковывался"); и т.д. Если возникает какая-то ошибка - её так же записывать Edited March 11, 2014 by Kotyarko_O @ Quote Link to comment Short link Share on other sites More sharing options...
KillerBot611 Posted March 16, 2014 Share Posted March 16, 2014 Я хочу изменить начальный путь установки, чтобы при запуске модпака изначально предлагалась другой путь установки. Как мне это сделать? @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted March 16, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
KillerBot611 Posted March 16, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.