Inno Setup:将文件复制到用户定义的多个目的地

时间:2010-09-02 09:31:47

标签: file copy install inno-setup

在安装过程中,用户可以安装一些服务实例(Service1-ServiceN)。这些服务之间的所有差异 - 配置文件的内容(实际上/ Product_Root / run中只有一个可执行文件,使用不同的命令行参数调用)。位于ProductRoot / ServiceX / conf中的配置文件。

文件夹结构如下:

/Product_Root
----/bin
----/doc
----/Service1
---------/conf
----/Service2
---------/conf
...
----/ServiceN
---------/conf

在ProductRoot / ServiceX / conf中,例如,service.properties文件包含以下内容:

#...
ServiceRoot = <%ROOT_DIRECTORY%>
ListenPort = <%PORT%>
#...

同样在每个服务启动的/ Product_Root / bin脚本中应该存在: 例如:

/Product_Root/bin/Service1.run.cmd
/Product_Root/bin/Service2.run.cmd
...
/Product_Root/bin/ServiceN.run.cmd
...

脚本文件结构是:

service.exe ../<%SERVICE_NAME%>/conf/service.properties

所有值(例如&lt;%SERVICE_NAME%&gt;,&lt;%PORT%&gt;等)均由用户在每个服务的设置过程中设置。 服务量也由用户设置,可以在1(默认)和20-30之间变化。

如果是单一服务 - 没有问题。

正在复制的文件,使用

创建的目录
[Files]
Source: {#FilesPath}\bin\*.*; DestDir: {app}\{#FileLocationPrefix}\bin; Flags: ignoreversion restartreplace
Source: {#АilesPath}\conf\*.*; DestDir: {app}\{#FileLocationPrefix}\{code:GetServiceName}\conf; Flags: ignoreversion recursesubdirs createallsubdirs restartreplace; 

[Dirs]
Name: {app}\{#FileLocationPrefix}{code:GetServiceName}\conf

在ssPostInstall步骤中,通配符替换在复制的文件中执行。

问题。

是否可以使用Inno Setup + ISTool在服务数量方面做同样的事情?

E.g。类似的东西:

[Files]
#for (i = 0; i < ServiceCount(); ++i) 
Source: {#АilesPath}\conf\*.*; DestDir: {app}\{#FileLocationPrefix}\{code:GetServiceName| i}\conf; Flags: ignoreversion recursesubdirs createallsubdirs

其中i - 实际上是配置号。 即是否可以在[文件],[Dirs]等部分的安装过程中使用从用户收到的信息,以便在不同的目录中多次复制相同的文件? 用于在安装过程中复制用户设置的具有不同名称的文件数的单个文件吗?

或者我只是朝着错误的方向前进?

1 个答案:

答案 0 :(得分:1)

所以,目前我已经这样做了。欢迎评论。 用于创建和复制所有文件:

#define MaxFEInstances 20
...
#sub CreateConf
Source: {#FilesPath}\conf\*.*; DestDir: {app}\{#FileLocationPrefix}{code:GetServiceName|{#counter}}\conf; Flags: ignoreversion recursesubdirs createallsubdirs restartreplace; Check: InstanceSetupRequired({#counter}); Components: main
#endsub
#for {counter = 0; counter < MaxInstances; ++counter} CreateConf
enter code here
...
function InstanceSetupRequired(InstanceNum: Integer): Boolean;
begin
  Result := InstanceNum < Instances;
end;

对于单独的文件,它看起来非常相似。