Подтвердить что ты не робот

Можно ли принимать параметры пользовательской командной строки с помощью Inno Setup

Я готовлю установщика с Inno Setup. Но я хотел бы добавить дополнительные параметры командной строки (ни один из доступных параметров) и хотел бы получить значение параметра, например:

setup.exe /do something

Проверьте, указано ли /do, затем получите значение чего-то. Является ли это возможным? Как я могу это сделать?

4b9b3361

Ответ 1

С InnoSetup 5.5.5 (и, возможно, другими версиями) просто передайте все, что хотите, в качестве параметра, с префиксом /

c:\> myAppInstaller.exe /foo=wiggle

и в вашем myApp.iss:

[Setup]
AppName = {param:foo|waggle}

|waggle предоставляет значение по умолчанию, если параметр не соответствует. Настройка Inno не чувствительна к регистру. Это особенно приятный способ обработки параметров командной строки: они всего лишь spring. Я бы хотел, чтобы был доступный способ сообщить пользователям о параметрах командной строки, о которых заботится установщик.

Кстати, это приводит к тому, что ответы @knguyen и @steve-dunn несколько избыточны. Функции утилиты выполняют именно то, что делает встроенный синтаксис {param:}.

Ответ 2

Это функция, которую я написал, что является улучшением ответа Стивена Данна. Вы можете использовать его как:

c:\MyInstallDirectory>MyInnoSetup.exe /myParam="parameterValue"
myVariable := GetCommandLineParam('/myParam');
{ util method, equivalent to C# string.StartsWith }
function StartsWith(SubStr, S: String): Boolean;
begin
  Result:= Pos(SubStr, S) = 1;
end;

{ util method, equivalent to C# string.Replace }
function StringReplace(S, oldSubString, newSubString: String): String;
var
  stringCopy: String;
begin
  stringCopy := S; { Prevent modification to the original string }
  StringChange(stringCopy, oldSubString, newSubString);
  Result := stringCopy;
end;

{ ================================================================== }
function GetCommandlineParam(inParamName: String): String; 
var
   paramNameAndValue: String;
   i: Integer;
begin
   Result := '';

   for i := 0 to ParamCount do
   begin
     paramNameAndValue := ParamStr(i);
     if (StartsWith(inParamName, paramNameAndValue)) then
     begin
       Result := StringReplace(paramNameAndValue, inParamName + '=', '');
       break;
     end;
   end;
end;

Ответ 3

Если вы хотите проанализировать аргументы командной строки из кода в inno, используйте метод, подобный этому. Просто вызовите inno script из командной строки следующим образом:

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 arry 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;

Ответ 4

Да, вы можете использовать функцию ParamStr в PascalScript для доступа ко всем параметрам командной строки. Функция ParamCount даст вам количество параметров командной строки.

Другая возможность - использовать GetCmdTail

Ответ 5

Кроме ответа @DanLocks, константа {param: ParamName | DefaultValue} задокументирована в нижней части страницы Constants:

http://www.jrsoftware.org/ishelp/index.php?topic=consts

Я нашел его весьма удобным для факультативного подавления страницы лицензии. Вот все, что мне нужно было добавить (используя Inno Setup 5.5.6 (a)):

[code]
{ If there is a command-line parameter "skiplicense=true", don't display license page }
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := False
  if PageId = wpLicense then
    if ExpandConstant('{param:skiplicense|false}') = 'true' then
      Result := True;
end;

Ответ 6

Inno Setup напрямую поддерживает переключатели с синтаксисом /Name=Value с помощью {param} constant.


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

Пример:

[Registry]
Root: HKCU; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; \
    ValueName: "Mode"; ValueData: "{param:Mode|DefaultMode}"

Скорее всего, вы захотите использовать коммутаторы в Pascal Script.

Если ваш коммутатор имеет синтаксис /Name=Value, самый простой способ прочитать его значение - это ExpandConstant function.

Например:

if ExpandConstant('{param:Mode|DefaultMode}') = 'DefaultMode' then
begin
  Log('Installing for default mode');
end
  else
begin
  Log('Installing for different mode');
end;

Если вы хотите использовать значение переключателя для переключения записей в разделах, вы можете использовать Check параметр и вспомогательную функцию, например

[Files]
Source: "Client.exe"; DestDir: "{app}"; Check: SwitchHasValue('Mode', 'Client')
Source: "Server.exe"; DestDir: "{app}"; Check: SwitchHasValue('Mode', 'Server')
[Code]

function SwitchHasValue(Name: string; Value: string): Boolean;
begin
  Result := CompareText(ExpandConstant('{param:' + Name + '}'), Value) = 0;
end;

По иронии судьбы, сложнее проверить наличие коммутатора (без значения).

Использование может использовать функцию CmdLineParamExists из ответа @TLama на Передача условного параметра в Inno Setup

function CmdLineParamExists(const Value: string): Boolean;
var
  I: Integer;  
begin
  Result := False;
  for I := 1 to ParamCount do
    if CompareText(ParamStr(I), Value) = 0 then
    begin
      Result := True;
      Exit;
    end;
end;

Очевидно, вы можете использовать функцию в Pascal Script:

if CmdLineParamExists('/DefaultMode') then
begin
  Log('Installing for default mode');
end
  else
begin
  Log('Installing for different mode');
end;

Но вы даже можете использовать его в разделах, наиболее типично используя параметр Check:

[Files]
Source: "MyProg.hlp"; DestDir: "{app}"; Check: CmdLineParamExists('/InstallHelp')

Ответ 7

Я нашел ответ: GetCmdTail.

Ответ 8

В ответ на:

"С InnoSetup 5.5.5 (и, возможно, другими версиями) просто передайте все, что хотите, в качестве параметра, с префиксом /" @NickG, да, каждая константа, которую вы можете расширить с помощью функции ExpandConstant"

  • Это не так. Попытка использовать параметр командной строки в ExpandConstant в InnoSetup 5.5.6 приводит к ошибке выполнения.

PS: Я бы добавил комментарий напрямую, но, видимо, у меня не было достаточно "репутации"

Ответ 9

Я немного изменил ответ knguyen. Теперь он нечувствителен к регистру (вы можете написать en console/myParam или /MYPARAM ), и он может принимать значение по умолчанию. Также я исправил случай, когда вы получили более высокий параметр, чем ожидалось (для ex:/myParamOther = "parameterValue" вместо /myParam = "parameterValue". Теперь myParamOther не соответствует).

function GetCommandlineParam(inParamName: String; defaultParam: String): String; 
var
   paramNameAndValue: String;
   i: Integer;
begin
   Result := defaultParam;

   for i := 0 to ParamCount do
   begin
     paramNameAndValue := ParamStr(i);
     if  (Pos(Lowercase(inParamName)+'=', AnsiLowercase(paramNameAndValue)) = 1) then
     begin
       Result := Copy(paramNameAndValue, Length(inParamName)+2, Length(paramNameAndValue)-Length(inParamName));
       break;
     end;
   end;
end;

Ответ 10

Вы можете передавать параметры в сценарии установщика. Установите препроцессор Inno Setup и прочитайте документацию о передаче пользовательских параметров командной строки.