Передача строкового значения в Inno Setup из приложения командной строки
-
03-07-2019 - |
Вопрос
Сценарий заключается в том, что у нас есть клиент-серверное приложение, установка клиента которого является загрузчиком с использованием Inno Setup, который загружает клиент с сервера, указанного по IP / номеру порта.Мы хотели бы иметь возможность определять, есть ли сервер в локальной сети с помощью широковещательной передачи UDP, и можем написать консольное приложение, которое это делает.Проблема в том, как нам передать информацию из консольного приложения установщику?
Я могу записать код возврата, но это может быть только int.Насколько я могу судить, единственные функции для чтения файла в Inno Setup находятся в препроцессоре, поэтому мы не можем прочитать файл, созданный во время выполнения консольным приложением.Единственное, что я могу придумать, это вернуть int, где первые 4 цифры - это позиция '.'s и :перед портированием, а затем проанализируйте значение, которое кажется хакерским, надуманным и подверженным ошибкам, особенно учитывая, что я не очень хорошо знаком с синтаксисом / функциями Inno Setup для построения строки.
Есть какие-нибудь предложения?
Решение
Не знаю, как загрузить параметр из командной строки, но вы можете использовать LoadStringFromFile
для загрузки содержимого файла или GetIniString
для чтения параметра из INI-файл.
В общем, ищите " Справочник по функциям поддержки " в файле справки Inno Setup. Эта страница предоставит вам список всех функций Inno (не включая препроцессор). Если вы не можете найти эту страницу (если вы только находите информацию о препроцессоре), возможно, вы искали неправильный файл справки. Обратите внимание, что содержание справки Inno Setup не так уж и велико, но индекс очень хорош.
Параметры командной строки задокументированы на странице «Настройка параметров командной строки». Вполне возможно, что вы сможете обмануть Inno, используя один из существующих параметров, но использование INI-файла кажется наиболее простым подходом.
Другие советы
Если вы хотите проанализировать аргументы командной строки из кода в Inno Setup, используйте метод, подобный этому. Просто вызовите установщик из командной строки следующим образом:
c:\MyInstallDirectory>MyInnoSetup.exe -myParam parameterValue
Затем вы можете вызывать GetCommandLineParam
следующим образом:
myVariable := GetCommandLineParam('-myParam');
{ ================================================================== }
{ Allows for standard command line parsing assuming a key/value organization }
function GetCommandlineParam (inParam: String):String;
var
LoopVar : Integer;
BreakLoop : Boolean;
begin
{ Init the variable to known values }
LoopVar :=0;
Result := '';
BreakLoop := False;
{ Loop through the passed in array to find the parameter }
while ( (LoopVar < ParamCount) and
(not BreakLoop) ) do
begin
{ Determine if the looked for parameter is the next value }
if ( (ParamStr(LoopVar) = inParam) and
( (LoopVar+1) < ParamCount )) then
begin
{ Set the return result equal to the next command line parameter }
Result := ParamStr(LoopVar+1);
{ Break the loop }
BreakLoop := True;
end
{ Increment the loop variable }
LoopVar := LoopVar + 1;
end;
end;
Надеюсь, это поможет ...
InnoSetup включает в себя интерпретируемый Pascal-подобный язык расширений, который может использоваться во многих случаях во время выполнения программы установки. Р>
Например, я знаю, что он может читать реестр, и я вполне уверен, что он может читать файлы, по крайней мере, из некоторых папок. Ваше приложение в режиме консоли может записать временный файл или удалить один или несколько ключей реестра, содержащих информацию, необходимую для остальной части установщика, и которую можно вернуть из среды сценариев в собственно сценарий установки. Установщик может даже позже очистить временный файл и / или ключи.
Из руководства по настройке Inno:
{параметр:имя_параметра|Значение по умолчанию}
Embeds a command line parameter value.
* ParamName specifies the name of the command line parameter to read from.
* DefaultValue determines the string to embed if the specified command
line parameter does not exist, or its value could not be determined.
Пример:
[Настройка] AppID=...AppName={параметр:exe_name|xyz}.exe
Еще:www скачатьatoz com/manual/in/inno-setup/topic_consts.htm
Приведенный выше анонимный ответ должен быть отклонен.
Мне удалось передать аргумент установщику, просто указав в сценарии параметр по имени:
{param:filePath|abc}
А затем при вызове установщика передайте значение параметра в нужном формате:
MyInnoSetup.exe /filePath=../foo.exe