2012-03-07 20 views
5

He empezado a aprender scripts de Innosetup por mi cuenta. Para esto, he creado una aplicación simple de consola C#, que lee un elemento de un archivo de configuración y las envía a la consola.cómo modificar el archivo exe.config del script Innosetup

<configuration> 
    <appSettings> 
    <add key ="Name" value="Brad Pitt"/> 
    </appSettings> 
</configuration> 

Por ejemplo: Leerá el valor consultando el atributo clave "Nombre".

Quiero que el valor en .config se escriba desde la secuencia de comandos de instalación de Innosetup.

es decir, durante el proceso de instalación i se reunirán el nombre (es decir, "Brad Pitt" en este caso) y escribirla en el valor del archivo de configuración

<add key ="Name" value="Brad Pitt"/> 

La pregunta es ¿cómo lograr esto, el uso de una secuencia de comandos Pascal o una secuencia de comandos estándar.

Cualquier orientación es muy apreciada

Saludos

Vatsa

+0

posible duplicado de [Inno Setup modify XML file based on custom input] (http://stackoverflow.com/questions/8141886/inno-setup-modify-xml-file-based-on-custom-input) – Deanna

Respuesta

7

Para ello he creado un procedimiento sencillo, que lleva el nombre del archivo XML como entrada. El procedimiento analizará cada línea y escribirá el contenido en un archivo temporal. El código comprueba cada línea en busca de la cadena 'key = 'Nombre'':

if (Pos('key="Name"', strTest) <> 0) 

Si encuentra una coincidencia, entonces puedo reemplazar esa línea en particular por mi etiqueta deseada, de los cuales el value se consigue de mi página personalizada .

strTest := ' <add key="Name" value="' + strName + '"/> '; 

Esto se escribe en un archivo temporal. Luego borro el archivo exe.config original y renombro el archivo de configuración de temperatura al archivo exe.config (reflejando así los cambios que necesito). A continuación se muestra el fragmento de código para el procedimiento, y no se olvide de llamar al procedimiento de [Archivos] Es decir

[Files] 
Source: "HUS.exe.config"; DestDir: "{app}"; AfterInstall: ConvertConfig('HUS.exe.config') 

Fragmento de código

procedure ConvertConfig(xmlFileName: String); 
var 
    xmlFile: String; 
    xmlInhalt: TArrayOfString; 
    strName: String; 
    strTest: String; 
    tmpConfigFile: String; 
    k: Integer; 
begin 
    xmlFile := ExpandConstant('{app}') + '\' + xmlFileName; 
    tmpConfigFile:= ExpandConstant('{app}') + '\config.tmp'; 
    strName := UserPage.Values[0] +' '+ UserPage.Values[1]; 

    if (FileExists(xmlFile)) then begin 
    // Load the file to a String array 
    LoadStringsFromFile(xmlFile, xmlInhalt); 

    for k:=0 to GetArrayLength(xmlInhalt)-1 do begin 
     strTest := xmlInhalt[k]; 
     if (Pos('key="Name"', strTest) <> 0) then begin 
     strTest := ' <add key="Name" value="' + strName + '"/> '; 
     end; 
     SaveStringToFile(tmpConfigFile, strTest + #13#10, True); 
    end; 

    DeleteFile(xmlFile); //delete the old exe.config 
    RenameFile(tmpConfigFile,xmlFile); 
    end; 
end; 
4

Sé que es un poco viejo ahora, pero aquí hay otro enfoque; utilizar MSXML

procedure UpdateConfig(); 
var 
    XMLDoc, NewNode, RootNode, Nodes, Node: Variant; 
    ConfigFilename, Key: String; 
    i: integer; 

begin 
    ConfigFilename := ExpandConstant('{app}') + '\your-app-name.exe.config'; 

    try 
     XMLDoc := CreateOleObject('MSXML2.DOMDocument'); 
    except 
    RaiseException('MSXML is required to complete the post-installation process.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)'); 
    end; 

    XMLDoc.async := False; 
    XMLDoc.resolveExternals := False; 
    XMLDoc.load(ConfigFilename); 
    if XMLDoc.parseError.errorCode <> 0 then 
    RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ', position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason); 

    RootNode := XMLDoc.documentElement; 
    Nodes := RootNode.selectNodes('//configuration/appSettings/add'); 
    for i := 0 to Nodes.length - 1 do 
    begin 
    Node := Nodes.Item[i]; 
    if Node.NodeType = 1 then 
    begin 
     key := Node.getAttribute('key'); 
     Case key of 
     'MyValue1' : Node.setAttribute('value', ConfigPage.Values[0]); 
     'MyValue2' : Node.setAttribute('value', ConfigPage.Values[1]); 
     'MyValue3' : Node.setAttribute('value', ConfigPage.Values[2]); 
     end; 
    end; 
    end; 

    XMLDoc.Save(ConfigFilename); 

end; 

Cheers, Matt

+0

Uso de nodos. El elemento [i] en mi código me da un "No puedo importar VARARRAYGET" error al iniciar la configuración real. – Nyerguds

+0

Lo siento, no importa eso. El error fue causado por NO usar .Item en otra iteración. Gracias por eso, mi código funciona ahora :) – Nyerguds

0

Sólo contribuyendo, aquí sigue una actualización del procedimiento anterior, los parámetros que ahora reciben, para ser utilizado con cualquier atributo:

procedure UpdateConfigKeyValue(ConfigFilename,NodeName,KeyName,Value:String); 
var 
    XMLDoc, NewNode, RootNode, Nodes, Node: Variant; 
    Key: String; 
    i: integer; 
begin 
    try 
     XMLDoc := CreateOleObject('MSXML2.DOMDocument'); 
    except 
    RaiseException('MSXML is required to complete the post-installation process.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)'); 
    end; 

    XMLDoc.async := False; 
    XMLDoc.resolveExternals := False; 
    XMLDoc.load(ConfigFilename); 
    if XMLDoc.parseError.errorCode <> 0 then 
    RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ', position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason); 

    RootNode := XMLDoc.documentElement; 
    Nodes := RootNode.selectNodes(NodeName); 
    for i := 0 to Nodes.length - 1 do 
    begin 
    Node := Nodes.Item[i]; 
    if Node.NodeType = 1 then 
    begin 
     key := Node.getAttribute('key'); 
     Case key of 
     KeyName : Node.setAttribute('value', Value); 
     end; 
    end; 
    end; 

    XMLDoc.Save(ConfigFilename); 

end; 

Ejemplo de uso:

UpdateConfigKeyValue(ConfigPath,'//configuration/appSettings/add','hibernate.connection.data_source',SQLServer); 
Cuestiones relacionadas