5

Innosetup スクリプトを独学で学び始めました。このために、構成ファイルから要素を読み取り、コンソールに出力する単純な C# コンソール アプリケーションを作成しました。

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

例: キー属性「名前」を照会して値を読み取ります。

.config の値が Innosetup セットアップ スクリプトから書き込まれるようにします。

つまり、インストール プロセス中に、名前 (この場合は「Brad Pitt」) を収集し、それを構成ファイルの値に書き込みます。

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

問題は、Pascal スクリプトまたは標準スクリプトを使用して、これをどのように達成するかです。

ご指導をお待ちしております

よろしく

ヴァツァ

4

3 に答える 3

7

これを実現するために、xml ファイル名を入力として受け取る簡単な手順を作成しました。この手順では、各行を解析し、その内容を一時ファイルに書き込みます。このコードは、文字列 'key="Name"' を探して各行をチェックします。

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

value一致が見つかった場合は、その特定の行を、カスタム ページから取得した目的のタグに置き換えます。

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

これは一時ファイルに書き込まれます。次に、元の exe.config ファイルを削除し、一時構成ファイルの名前を exe.config ファイルに変更します (これにより、必要な変更が反映されます)。以下は、プロシージャのコード スニペット全体です。[Files] からプロシージャを呼び出すことを忘れないでください。

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

コードスニペット

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;
于 2012-03-07T16:29:34.430 に答える
5

今は少し古いことはわかっていますが、別のアプローチがあります。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;

乾杯、マット

于 2013-02-11T06:58:08.643 に答える