Jump to content
Korean Random
EvilAlex

Создание инсталляторов для модпаков на базе Inno Setup

Recommended Posts

 

 

бэкапятся только файлы в самой папке, из вложенных ничего не копируется.

Это плохо, мне нужно все вложения.
Сделай пожалуйста полностью весь скрипт.

Задача:  Бэкапить (копировать со всеми вложениями) папку   World_of_Tanks\res\scripts\    ,  например в  \res\scripts_backup ,   прежде проверив имеется ли такая бэкап папка, если имеется то не бэкапим.
И самое главное никакие чекбоксы и предупреждения выводить не нужно, пользователю незачем знать это.

Share this post


Link to post

Short link
Share on other sites

-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 by AtotIK

Share this post


Link to post

Short link
Share on other sites
Но проверкой тут и не пахнет. Можно сделать через мой пример backup'а, но там проблемы с классами в Unicode-версии Inno Setup - не все файлы копирует из папки-исходника.

Да нет спасибо, нужно именно с проверкой, чтоб не бэкапило второй раз (так как сохраняем оригинальные файлы клиента).

Твой пример я использую, но чтоб не было проблем с копированием использую переименование + подстановка даты и время

RenameFile(ExpandConstant('{app}\res_mods\'),

ExpandConstant('{app}\res_mods-backup-')+GetDateTimeString('dd/mm/yyyy  hh:nn', '_', '.' ));

end;

Но это для папки   res_mods  ,  а нужно еще сохранить оригинальные файлы.

Edited by -zav-

Share this post


Link to post

Short link
Share on other sites

-zav-, 2-й вариант из моего сообщения выше подходит?

Share this post


Link to post

Short link
Share on other sites

-zav-, 2-й вариант из моего сообщения выше подходит?

на вид вроде подходит, но почему то копирование не происходит

Share this post


Link to post

Short link
Share on other sites

на вид вроде подходит, но почему то копирование не происходит

Смотри через F8 выполняется ли кусок кода. Ну или скинь в ЛС скрипт, посмотрю потом.

Share this post


Link to post

Short link
Share on other sites

Ладно, решил проблему другим способом, просто внес бэкап папку чистых файлов клиента в инсталятор.

Я уже давно мучаюсь с этим копированием, похоже оно у меня не работает вообще как таковое. Перепробовал кучу вариантов.
Может есть у кого 100% работающий     script.iss   с копированием папки ? Поделитесь плиз, для тестов.

Использую unicode версию Inno Setup Compiler

Edited by -zav-

Share this post


Link to post

Short link
Share on other sites

-zav-, что-нибудь придумаю. Если перейдёшь на ANSI-версию, то все мои примеры заработают.

Edited by AtotIK

Share this post


Link to post

Short link
Share on other sites

-zav-, что-нибудь придумаю. Если перейдёшь на ANSI-версию, то все мои примеры заработают.

Приложи плиз к своему сообщению свою папку с этой версией, чтоб мне не устанавливать.

Но вобще говорят что у unicode вкрсии больше возможностей.

.

.....Можно даже в личку переходить уже, чтоб не флудить тут.

Edited by -zav-

Share this post


Link to post

Short link
Share on other sites

-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;
Копирование файлов происходит из-под командной строки.

З.Ы. Осталось только разобраться с возможностью перемещения. Уже голова не варит сегодня.

Share this post


Link to post

Short link
Share on other sites

Эх, написал 3 способа "бэкапа" папок, а оказывается нужно было начинать с человеческого фактора.

Share this post


Link to post

Short link
Share on other sites

MAKS_MAFIA, смотря что надо. Вообще тут можно собрать трансформер из способов, которые я тут постил.

Share this post


Link to post

Short link
Share on other sites

@AtotIK, а возможно сделать возможность отладки, что-ли? (ссори за тавтологию)

Чтобы каждое действие, которое выполняет инсталлятор в ходе установки записывалось, например, в *.ini документ?

Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

Kotyarko_O, в принципе можно. Поковыряюсь как-нибудь. Поподробнее напиши как ты это видишь.

Edited by AtotIK

Share this post


Link to post

Short link
Share on other sites

@AtotIK, просто список со всеми выполненными событиями, всё, что делал инсталлятор при установке, примерно так:

(время; [файл1, над которым проделывалась операция]; "путь1, по которому он распаковывался");
(время; [файл2, над которым проделывалась операция]; "путь2, по которому он распаковывался");
(время; [файл3, над которым проделывалась операция]; "путь3, по которому он распаковывался");
и т.д.

Если возникает какая-то ошибка - её так же записывать

Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

Я хочу изменить начальный путь установки, чтобы при запуске модпака изначально предлагалась другой путь установки. Как мне это сделать? 

Share this post


Link to post

Short link
Share on other sites

Я хочу изменить начальный путь установки, чтобы при запуске модпака изначально предлагалась другой путь установки. Как мне это сделать? 

 Вот скрипт, определяющий по ветке реестра путь к игре:

'скрипт'

[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\'); - это путь, который будет предлагаться, если по реестру игру не удалось найти. Его и изменяй, как тебе удобно.

Это имел ввиду?

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 Вот скрипт, определяющий по ветке реестра путь к игре:

'скрипт'

[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 by KillerBot611

Share this post


Link to post

Short link
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...