2010-09-02 2 views
1

В процессе установки у пользователя есть возможность установить несколько экземпляров службы (Service1-ServiceN). Все различия между этими сервисами - содержимое конфигурационных файлов (на самом деле есть только один исполняемый файл в/Product_Root/run, который вызывается с различными параметрами командной строки). Конфигурирование файлов, расположенных в ProductRoot/ServiceX/conf.Inno Setup: копировать файл в несколько адресов, определенных пользователем

Папки структура выглядит следующим образом:

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

В ProductRoot/ServiceX/конф находится, например, 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 

Все значения (например, <% SERVICE_NAME%>, <% PORT%> и т.д.) устанавливается пользователем во время процесса для каждой службы установки. Количество услуг также задается пользователем и может варьироваться от 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 - на самом деле номер конфигурации. I.e. возможно ли использовать информацию, полученную от пользователя во время процесса установки в разделах [File], [Dirs] и т. д. для многократного копирования одних и тех же файлов в разных каталогах? Для копирования одного файла в количестве файлов с разными именами, установленными пользователем во время процесса установки?

Или я просто иду в неправильном направлении?

ответ

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; 

Для отдельных файлов он выглядит одинаково.

Смежные вопросы