ti-enxame.com

É possível aceitar parâmetros de linha de comando personalizados com o Inno Setup

Estou preparando um instalador com o Inno Setup. Mas eu gostaria de adicionar outros parâmetros de linha de comando personalizados (nenhum dos parâmetros disponíveis) e gostaria de obter o valor do parâmetro, como:

setup.exe /do something

Verifique se /do é dado, então obtenha o valor de algo. É possível? Como posso fazer isso?

28
Similar

Com o InnoSetup 5.5.5 (e talvez outras versões), basta passar o que quiser como parâmetro, prefixado por um /

c:\> myAppInstaller.exe /foo=wiggle

e no seu myApp.iss:

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

O |waggle fornece um valor padrão se nenhum parâmetro corresponder. A configuração Inno não diferencia maiúsculas de minúsculas. Essa é uma maneira particularmente agradável de lidar com as opções de linha de comando: elas apenas surgem. Eu gostaria que houvesse uma maneira astuta de informar aos usuários quais parâmetros de linha de comando o instalador se importa.

BTW, isso torna as respostas de @ knguyen e @ steve-dunn um tanto redundantes. As funções do utilitário fazem exatamente o que a sintaxe interna {param:} faz.

30
Dan Locks

Além da resposta do @DanLocks, a constante {param: ParamName | DefaultValue} está documentada na parte inferior da Página de constantes:

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

Eu achei bastante útil para suprimir opcionalmente a página de licença. Aqui está tudo o que eu precisava adicionar (usando o 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;
11
Mark Berry

Se você deseja analisar argumentos de linha de comando do código no inno, use um método semelhante a este. Basta chamar o script inno na linha de comando da seguinte maneira:

c:\MyInstallDirectory>MyInnoSetup.exe -myParam parameterValue

Em seguida, você pode chamar o GetCommandLineParam dessa maneira sempre que precisar:

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;
10
Steven Dunn

Essa é a função que escrevi, que é uma melhoria da resposta de Steven Dunn. Você pode usá-lo como:

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;
10
knguyen

Sim, é possível, você pode usar a função ParamStr no PascalScript para acessar todos os parâmetros da linha de comando. A função ParamCount fornecerá o número de parâmetros da linha de comando.

Outra possibilidade é usar GetCmdTail

7
Otherside

O Inno Setup suporta diretamente comutadores com sintaxe /Name=Value usando {param} constante .


Você pode usar a constante diretamente nas seções, embora esse uso seja bastante limitado.

Um exemplo:

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

É mais provável que você queira usar opções em Pascal Script .

Se o seu switch tiver a sintaxe /Name=Value, a maneira mais fácil de ler seu valor é usando ExpandConstant function .

Por exemplo:

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

Se você deseja usar um valor de opção para alternar entradas nas seções, pode usar Check parameter e uma função auxiliar, como:

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

Ironicamente, é mais difícil verificar a presença de um comutador (sem valor).

Use pode usar uma função CmdLineParamExists da resposta do @ TLama para Passando parâmetro condicional no 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;

Obviamente, você pode usar a função no Pascal Script:

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

Mas você pode até usá-lo em seções, geralmente usando o parâmetro Check:

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

Encontrei a resposta: GetCmdTail.

0
Similar

Eu modifiquei um pouco knguyen resposta. Agora faz distinção entre maiúsculas e minúsculas (você pode gravar no console/myParam ou/MYPARAM) e pode aceitar o valor padrão. Também corrigi o caso quando você recebe um parâmetro maior do que o esperado (por exemplo:/myParamOther = "parameterValue" no lugar de/myParam = "parameterValue". Agora myParamOther não corresponde.

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;
0
Irina Leo

Em resposta a:

"Com o InnoSetup 5.5.5 (e talvez outras versões), basta passar o que quiser como parâmetro, prefixado por /" "@NickG, sim, todas as constantes que você pode expandir pela função ExpandConstant"

  • Este não é o caso. Tentar usar um parâmetro de linha de comando no ExpandConstant no InnoSetup 5.5.6 resulta em um erro de tempo de execução.

PS: Eu adicionaria um comentário diretamente, mas aparentemente não tenho "reputação" suficiente

0
Sloth