在排除某些文件夹(备份文件夹本身)的同时备份Inno Setup中的先前安装

时间:2018-08-23 08:57:48

标签: inno-setup pascalscript

我正在创建安装程序以更新服务。我的想法是:

  1. 停止服务
  2. 备份名为backup的文件夹中的所有文件和文件夹。
  3. 删除所有文件和文件夹
  4. 复制(安装)新文件和文件夹
  5. backup复制一些文件(配置文件),以覆盖创建的新文件。

这实际上是我的代码:

[Run]
;1. Stop service
Filename: "{sys}\sc.exe"; Parameters: "stop ""myService"

[Files]
;2. Create temporally backup
Source: {app}\*; Excludes: "backup"; DestDir: {app}\backup\backup{code:GetTodaysName}; \
    Flags: external skipifsourcedoesntexist recursesubdirs createallsubdirs

;Install new version.
Source: "{#MyInstalerPath}\bin\*"; DestDir: "{app}"; \
    Flags: ignoreversion recursesubdirs createallsubdirs

;Restore config files.
Source: "{app}\backup\backup{code:GetTodaysName}\myService.Configuration.xml"; \
    DestDir: "{app}"; Flags: external 
[Code]
var
  TodaysName : String;

function GetToday : String;
begin
  Result := GetDateTimeString ('yyyymmddhhnnss', '-', #0);
end;

function GetTodaysName (Param: String): String;
begin
  if ('' = TodaysName) then
  begin
    TodaysName := GetToday ();
  end;
  Result := TodaysName;
end;

我在第2部分和第3部分中遇到问题。我应该避免在backup进程中使用备份文件夹,但是不能同时使用Excludesexternal

任何人都可以帮助解决此问题吗? 谢谢

1 个答案:

答案 0 :(得分:1)

如果要排除某些文件,则必须使用Pascal脚本复制/备份文件。

请参见Inno Setup: Backup external file before install delete section

除了需要修改Inno Setup: copy folder, subfolders and files recursively in Code section中的DirectoryCopy函数以排除backup文件夹本身。

只需修改此行:

if (FindRec.Name <> '.') and (FindRec.Name <> '..') then

if (FindRec.Name <> '.') and (FindRec.Name <> '..') and
   (CompareText(FindRec.Name, 'backup') <> 0) then

尽管如果备份是“临时的”,为什么不将文件备份到{tmp}而不是{app}的子文件夹?这样您就不必排除任何内容。