【问题标题】:Unable to Find String in a file and populate it using Inno Setup?无法在文件中查找字符串并使用 Inno Setup 填充它?
【发布时间】:2015-08-17 10:57:05
【问题描述】:

我有 demo.properties 文件,我可以加载文件并迭代以获取其中存在的所有值。

hibernate.connection.username=jack
hibernate.connection.password=queen
hibernate.connection.url=jdbc:jtds:sqlserver://localhost/cabinet

但是当我得到第 1 行(能够逐行获取但无法获取特定字符串)并且我想填充 jack 并将其存储到用户名字符串中,类似地,queen 到密码字符串和本地主机到数据库字符串。这是我的代码/获取值的逻辑。

procedure InitializeWizard;
var  

  xmlInhalt: TArrayOfString;  
  k : Integer;
  CurrentLine : String;
  Uname : String;  
   Password : String;
   HostName : String;
   STR : String;                        

begin
          LoadStringsFromFile('C:\demo.properties', xmlInhalt);
          for k:=0 to GetArrayLength(xmlInhalt)<>-1 do
          begin
            CurrentLine := xmlInhalt[k];
            MsgBox(CurrentLine, mbError, MB_OK);
            if (Pos('hibernate.connection.username=', CurrentLine) <>-1 ) then
                begin
                              MsgBox(CurrentLine, mbError, MB_OK);
                    Uname := Pos('://', CurrentLine);
                    STR :=IntToStr(Uname);    
                    STR :=IntToStr(Length('://')); 
                    Password := Pos(':1', CurrentLine);
                    HostName :=Password -Uname;                  

              end;    
         end; 
end;

请帮助我满足我的要求。我们将不胜感激。

【问题讨论】:

    标签: arrays string inno-setup pascalscript


    【解决方案1】:

    如果TStrings 类发布了NameValueSeparatorValues 属性,我建议使用它。但它没有,所以这里有一个解决方法的代码(它使用TArrayOfString,但很容易为TStrings 类修改它):

    [Setup]
    AppName=My Program
    AppVersion=1.5
    DefaultDirName={pf}\My Program
    
    [Code]
    function TryGetValue(const Strings: TArrayOfString; const Name: string;
      out Value: string): Boolean;
    var
      S: string;
      P: Integer;
      I: Integer;
    begin
      Result := False;
      { loop through the array }
      for I := 0 to GetArrayLength(Strings) - 1 do
      begin
        { store the currently iterated string into a local variable }
        S := Strings[I];
        { try to get position of the name value separator ('='in this case) }
        P := Pos('=', S);
        { if the separator was found on this line, and a text on the left of }
        { it matches (case insensitively) the input Name parameter value, we }
        { found what we were looking for, so return True and the rest of the }
        { text after the found separator }
        if (P <> 0) and (CompareText(Copy(S, 1, P - 1), Name) = 0) then
        begin
          Value := Copy(S, P + 1, MaxInt);
          Result := True;
          Exit;
        end;
      end;
    end;
    
    { do note, that this function may not conform the RFC 3986 specification; }
    { preferred way should be e.g. InternetCrackUrl, but with this particular }
    { scheme (jdbc:jtds:sqlserver) it didn't crack the URL properly }
    function GetHostName(const URL: string): string;
    var
      P: Integer;
    begin
      Result := '';
      P := Pos('://', URL);
      if P <> 0 then
      begin
        Result := Copy(URL, P + 3, MaxInt);
        P := Pos('/', Result);
        if P = 0 then
          P := MaxInt;
        Result := Copy(Result, 1, P - 1);
      end;
    end;
    
    procedure InitializeWizard;
    var  
      URL: string;
      HostName: string;
      UserName: string;
      Password: string;
      StrArray: TArrayOfString;
    begin
      if LoadStringsFromFile('C:\File.txt', StrArray) then
      begin
        TryGetValue(StrArray, 'hibernate.connection.url', URL);
        HostName := GetHostName(URL);
        TryGetValue(StrArray, 'hibernate.connection.username', UserName);
        TryGetValue(StrArray, 'hibernate.connection.password', Password);
        MsgBox(Format(
          'HostName: %s' + #13#10 + 'UserName: %s' + #13#10 + 'Password: %s', [
          HostName, UserName, Password]
        ), mbInformation, MB_OK);
      end; 
    end;
    

    【讨论】:

    • TLama,一切正常,主机名应该只是本地主机而不是整行。如何提取它。
    • 感谢 TLama 为解决这个问题所做的努力,目前主机名:jdbc:jtds:sqlserver://localhost/cabinet 因为只需要 localhost 名称。如何获取子字符串。
    • 请稍等。我将发布一个单独的问答,我将展示如何破解一个 URL,因为它不应该是简单的 Copy(即使这样有效)。
    • TLama,你能告诉我如何从整个字符串中获取该值吗?
    • 查看更新。我正要向您展示如何正确破解 URL,但由于某种原因,InternetCrackUrl 函数(我希望它是此任务的首选)无法处理带有冒号的方案(它成功但方案被第一个冒号和返回的主机名组件保持为空)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-11-11
    相关资源
    最近更新 更多