2012-03-07 18 views
5

Sam zacząłem się uczyć skryptów Innosetup. W tym celu stworzyłem prostą aplikację konsoli C#, która odczytuje element z pliku konfiguracyjnego i umieszcza go na konsoli.jak zmodyfikować exe.config ze skryptu Innosetup

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

Dla ex: Zostaje on odczytać wartość ustawiana zgodnie z klucza atrybut „name”.

Chcę, aby wartość w pliku .config została zapisana ze skryptu instalacyjnego Innosetup.

tj Podczas procesu instalacji i będą zbierać nazwę (czyli „Brad Pitt” w tym przypadku) i zapisać go do wartości pliku konfiguracyjnego

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

pytanie brzmi jak mogę to osiągnąć, stosując skrypt Pascala lub standardowy skrypt.

Wszelkie wskazówki są głęboko cenione

Pozdrowienia

vatsa

+0

możliwy duplikat [Inno Setup modyfikuj plik XML na podstawie niestandardowych danych wejściowych] (http://stackoverflow.com/questions/8141886/inno-setup-modify-xml-file-based-on-custom-input) – Deanna

Odpowiedz

7

W tym celu stworzyłem prostą procedurę, która przyjmuje nazwę pliku XML jako wejście osiągnąć. Procedura powinna przeanalizować każdą linię i zapisać zawartość w pliku tymczasowym. Kontrole kod każda linia szukający napisu „key =«Nazwa»”:

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

Jeśli znajdzie dopasowanie potem wymienić ten konkretny wiersz mojego pożądanego tag, którego value się dostał z mojej strony niestandardowego .

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

Zostanie to zapisane w pliku tymczasowym. Następnie usuwam oryginalny plik exe.config i zmieniam nazwę pliku config na plik exe.config (odzwierciedlając w ten sposób potrzebne zmiany). Poniżej jest cały fragment kodu do procedury i nie zapomnij, aby wywołać procedurę z [Files] tj

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

Code Snippet

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

Wiem, że to trochę stary, ale teraz tutaj jest inne podejście; używać 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

Używanie Nodes.Item [i] w moim kodzie daje mi "Nie można zaimportować VARARRAYGET" błąd podczas uruchamiania aktualnej konfiguracji. – Nyerguds

+0

Przepraszam, nieważne. Błąd został spowodowany przez NIE używanie .Item w innej iteracji. Dzięki za to, mój kod działa teraz :) – Nyerguds

0

Wystarczy przyczyniając się tu następująco aktualizację powyższej procedury, parametry teraz przyjmującego, być używany z dowolnym atrybucie:

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; 

przykład użycia:

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