2010-09-01 11 views

Respuesta

0

Encontré la respuesta: GetCmdTail.

7

Sí, es posible, puede usar la función ParamStr en PascalScript para acceder a todos los parámetros de la línea de comandos. La función ParamCount le dará el número de parámetros de la línea de comandos.

Otra posibilidad es utilizar GetCmdTail

-1

Puede pasar parámetros a las secuencias de comandos del instalador. Instale Inno Setup Preprocessor y lea la documentación sobre cómo pasar los parámetros personalizados de línea de comandos.

+1

El código del preprocesador se procesa antes de compilar el instalador, por lo que no se puede usar para verificar los parámetros de la línea de comandos del setup.exe resultante. – Otherside

+0

Lo sé, por eso especifiqué "scripts de instalador" y no el ejecutable del instalador compilado. A menudo tuve que hacer esto, así que pensé en mencionar esta posibilidad. – Bernard

8

Si desea analizar los argumentos de la línea de comando del código en inno, utilice un método similar a este. Sólo tiene que llamar el guión Inno desde la línea de comandos de la siguiente manera:

c:\MyInstallDirectory>MyInnoSetup.exe -myParam parameterValue 

A continuación, se puede llamar al GetCommandLineParam gusta este lugar que lo necesite:

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

Lo encontré muy útil, pero no creo que admita valores de parámetros cotizados. –

+1

Una respuesta de @knguyen es simple y funciona con valores cotizados. –

+0

Puede usar 'ExpandConstant' para lograr lo mismo con una sola línea de código. Ver mi respuesta: https://stackoverflow.com/a/48349992/850848 –

9

Ésta es la función Escribí, lo cual es una mejora de la respuesta de Steven Dunn. Se puede utilizar 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; 
+1

Esto funciona muy bien. Solo agregué código para agregar automáticamente un '/' al valor de InParamName, si aún no comienza con él. De esta forma, solo necesito especificar el nombre del parámetro y no tener que preocuparme por el prefijo del nombre del parámetro correcto al obtener el valor del parámetro. –

+1

Estas respuestas están bien, pero con múltiples parámetros, la determinación de 'ParamCount' es otra consideración. Es por eso que 'ExpandConstant' es mucho más fácil. –

+0

Como @LaurieStearn comentó correctamente, puede usar 'ExpandConstant' para lograr lo mismo con una sola línea de código. Ver mi respuesta: https://stackoverflow.com/a/48349992/850848 –

21

Con InnoSetup 5.5.5 (y quizás otras versiones), sólo tiene que pasar lo que quieras como un parámetro, con el prefijo de un /

c:\> myAppInstaller.exe /foo=wiggle 

y en su myApp.iss:

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

El |waggle proporciona un valor predeterminado si no coincide ningún parámetro. La configuración Inno no distingue entre mayúsculas y minúsculas. Esta es una forma particularmente agradable de manejar opciones de línea de comando: simplemente comienzan a existir. Desearía que hubiera una manera tan ingeniosa de dejarles saber a los usuarios qué parámetros de línea de comando le interesan al instalador.

Por cierto, esto hace que las respuestas de @knguyen y @ steve-dunn sean algo redundantes. Las funciones de utilidad hacen exactamente lo que hace la sintaxis {param:} incorporada.

+1

@TLama: Tienes razón. Había combinado opciones de preprocesador con opciones de configuración en mi cabeza. –

+0

¿Hay alguna manera de aprovechar ese mecanismo en el código? Solo puedo hacerlo funcionar en la sección [Configuración], pero ¿puede usarlo en la sección [Script] de alguna manera? – NickG

+1

@NickG, sí, cada constante puede expandirse mediante la función 'ExpandConstant'. – TLama

0

Responde:

"Con InnoSetup 5.5.5 (y quizás otras versiones), sólo tiene que pasar lo que quieras como un parámetro, con el prefijo a /" '@NickG, sí, cada constantes pueden ampliar mediante la función ExpandConstant'

  • Este no es el caso .. Tratar de utilizar un parámetro de línea de comandos en ExpandConstant en InnoSetup 5.5.6 resultados en un error de ejecución

PD: me hubiera añadido un comentario directamente, pero al parecer no tengo suficiente "reputación"

+0

Funciona para mí en 5.5.6 (a). Sin embargo, las constantes tienen una sintaxis muy extraña; debe rodearlos con comillas simples dentro de la llamada de función ExpandConstant. Ver mi respuesta para un ejemplo. –

7

Más a la respuesta de @DanLocks, {param: ParamName | ValorPredeterminado} constante se documenta en la parte inferior de la página Constantes:

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

Me pareció bastante útil para suprimir opcionalmente la página de licencia. Aquí es todo lo que tenía que añadir (utilizando 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

He modificado respuesta un poco de knguyen. Ahora es insensible a mayúsculas y minúsculas (puede escribir en console/myParam o/MYPARAM) y puede aceptar valores predeterminados. También arreglé el caso cuando recibes un parámetro más grande que el esperado (por ejemplo:/myParamOther = "parameterValue" en lugar de/myParam = "parameterValue". Ahora myParamOther no coincide).

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, muchas gracias. Realmente funciona, pero con esta sintaxis ExpandConstant ('{param: name | defaultvalue}') –

+0

OK, true, así que corrige mi comando: \t Si bien esto funcionaría, es totalmente innecesario, ya que otras respuestas muestran que puedes usar ' ExpandConstant ('{param: name | defaultvalue}') 'para lograr exactamente la misma funcionalidad. –

1

Inno Setup apoya directamente interruptores con sintaxis /Name=Value usando {param} constant.


Puede usar la constante directamente en secciones, aunque este uso es bastante limitado.

Un ejemplo:

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

usted más probable es que desee utilizar interruptores en Pascal Script.

Si su interruptor tiene la sintaxis /Name=Value, la forma más fácil de leer su valor es usando ExpandConstant function.

Por ejemplo:

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

Si desea utilizar un valor interruptor para alternar las entradas en las secciones, puede utilizar Check parameter y una función 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; 

Irónicamente es más di difícil de verificar por la mera presencia de un interruptor (sin valor).

uso puede utilizar una función CmdLineParamExists de @ respuesta de Tlama a 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; 

Obviamente se puede utilizar la función en Pascal Script:

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

Pero incluso se puede utilizar en secciones, la mayor parte típicamente usando Check parámetro:

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