2010-09-01 3 views
21

Je prépare un programme d'installation avec Inno Setup. Mais je voudrais ajouter une commande supplémentaire (aucun des paramètres disponibles) des paramètres de ligne de commande et que vous souhaitez obtenir la valeur du paramètre, comme:Est-il possible d'accepter les paramètres de ligne de commande personnalisés avec Inno Setup?

setup.exe /do something 

Vérifiez si /do est donnée, puis obtenir la valeur de quelque chose. C'est possible? Comment puis-je faire ceci?

Répondre

0

J'ai trouvé la réponse: GetCmdTail.

7

Oui, il est possible, vous pouvez utiliser la fonction ParamStr en PascalScript pour accéder à tous les paramètres de la ligne de commande. La fonction ParamCount vous donnera le nombre de paramètres de la ligne de commande.

Une autre possibilité est d'utiliser GetCmdTail

-1

Vous pouvez passer des paramètres à vos scripts d'installation. Installez le Inno Setup Preprocessor et lisez la documentation sur le passage des paramètres de ligne de commande personnalisés.

+1

Le code du préprocesseur est traité avant la compilation du programme d'installation. Il ne peut donc pas être utilisé pour vérifier les paramètres de ligne de commande du fichier setup.exe qui en résulte. – Otherside

+0

Je sais, c'est pourquoi j'ai spécifié "scripts d'installation" et non le programme d'installation compilé. J'ai souvent eu besoin de faire cela, alors j'ai pensé que je mentionnerais cette possibilité. – Bernard

8

Si vous souhaitez analyser les arguments de la ligne de commande à partir du code dans inno, utilisez une méthode similaire à celle-ci. Il suffit d'appeler le script Inno de la ligne de commande comme suit:

c:\MyInstallDirectory>MyInnoSetup.exe -myParam parameterValue 

Ensuite, vous pouvez appeler le GetCommandLineParam comme ceci où que vous soyez:

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; 
+0

J'ai trouvé cela très utile, mais je ne pense pas qu'il supporte les valeurs de paramètres. –

+1

Une réponse par @knguyen est simple et fonctionne avec des valeurs entre guillemets. –

+0

Vous pouvez utiliser 'ExpandConstant' pour obtenir la même chose avec une seule ligne de code. Voir ma réponse: https://stackoverflow.com/a/48349992/850848 –

9

C'est la fonction J'ai écrit, ce qui est une amélioration de la réponse de Steven Dunn. Vous pouvez l'utiliser comme:

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; 
+1

Cela fonctionne très bien. J'ai seulement ajouté le code pour ajouter automatiquement un '/' à la valeur inParamName, si elle ne commence pas déjà avec. De cette façon, j'ai juste besoin de spécifier le nom du paramètre, et ne pas avoir à se soucier du préfixe du nom de paramètre correct lors de l'obtention de la valeur du paramètre. –

+1

Ces réponses sont correctes, mais avec plusieurs paramètres, la détermination de 'ParamCount' est une autre considération. C'est pourquoi 'ExpandConstant' est tellement plus facile. –

+0

Comme @LaurieStearn a commenté correctement, vous pouvez utiliser 'ExpandConstant' pour obtenir la même chose avec une seule ligne de code. Voir ma réponse: https://stackoverflow.com/a/48349992/850848 –

21

Avec InnoSetup 5.5.5 (et peut-être d'autres versions), il suffit de passer tout ce que vous voulez en tant que paramètre, préfixé par un /

c:\> myAppInstaller.exe /foo=wiggle 
et

Le |waggle|waggle fournit une valeur par défaut si aucun paramètre ne correspond à la valeur . La configuration d'Inno n'est pas sensible à la casse. C'est une façon particulièrement agréable de gérer les options de la ligne de commande: elles ne font que naître. J'aurais aimé que les utilisateurs sachent à quels paramètres de la ligne de commande l'installateur se soucie.

BTW, cela rend les réponses de @ knguyen et de @ steve-dunn quelque peu redondantes. Les fonctions utilitaires font exactement ce que fait la syntaxe intégrée {param:}.

+1

@TLama: Vous avez raison. J'avais confondu les options de pré-processeur avec les options de configuration dans ma tête. –

+0

Existe-t-il un moyen de tirer parti de ce mécanisme dans le code? Je peux seulement le faire fonctionner dans la section [Setup], mais pouvez-vous l'utiliser dans la section [Script] d'une manière ou d'une autre? – NickG

+1

@NickG, oui, chaque constante que vous pouvez développer par la fonction 'ExpandConstant'. – TLama

0

En réponse à:

"Avec InnoSetup 5.5.5 (et peut-être d'autres versions), passez tout ce que vous voulez en tant que paramètre, préfixé par un/» « @NickG, oui, chaque constante que vous pouvez étendre par la fonction ExpandConstant »

  • Ce n'est pas le cas .. Essayer d'utiliser un paramètre de ligne de commande dans ExpandConstant en InnoSetup 5.5.6 provoque une erreur d'exécution

PS: J'aurais ajouté un commentaire directement, mais apparemment je n'ai pas « réputation » assez

+0

Fonctionne pour moi dans 5.5.6 (a). Les constantes ont une syntaxe très étrange, cependant; vous devez les entourer de guillemets simples dans l'appel de fonction ExpandConstant. Voir ma réponse pour un exemple. –

7

plus à la réponse @DanLocks, le {param: ParamName | DefaultValue} constante est documenté près du bas de la page Constantes:

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

je l'ai trouvé très pratique pour supprimer le cas échéant la page de licence. Voici tout ce que je besoin d'ajouter (à l'aide 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; 
0

J'ai modifié réponse un peu knguyen. Maintenant, il est insensible à la casse (vous pouvez écrire en console/myParam ou/MYPARAM) et il peut accepter la valeur par défaut. J'ai aussi corrigé le cas lorsque vous avez reçu un paramètre plus grand que prévu (par ex:/myParamOther = "parameterValue" à la place de/myParam = "parameterValue" .MonParamOther ne correspond pas).

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

Martin, merci beaucoup. Cela fonctionne vraiment, mais avec cette syntaxe ExpandConstant ('{param: name | defaultvalue}') –

+0

OK, true, fixant ainsi ma commande: \t Bien que cela fonctionne, c'est totalement inutile, car d'autres réponses montrent que vous pouvez utiliser ' ExpandConstant ('{param: name | defaultvalue}') 'pour obtenir exactement la même fonctionnalité. –

1

Inno Setup supporte directement les interrupteurs avec la syntaxe /Name=Value utilisant {param} constant.


Vous pouvez utiliser la constante directement dans les sections, bien que cette utilisation soit assez limitée.

Un exemple:

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

Vous voulez plus susceptibles d'utiliser des commutateurs à Pascal Script.

Si votre commutateur a la syntaxe /Name=Value, la façon la plus simple de lire sa valeur est d'utiliser ExpandConstant function.

Par exemple:

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

Si vous souhaitez utiliser une valeur de commutateur pour basculer les entrées dans les sections, vous pouvez utiliser Check parameter et une fonction auxiliaire, comme:

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

Ironiquement, il est plus di difficile de vérifier la présence d'un simple interrupteur (sans valeur).

utilisation peut utiliser une fonction CmdLineParamExists de @ réponse de TLama à Passing conditional parameter in 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; 

Vous pouvez évidemment utiliser la fonction de Pascal Script:

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

Mais vous pouvez même l'utiliser dans les sections, la plupart généralement en utilisant Check paramètre:

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