如果权限不是管理员,Inno Setup会将文件安装在不同的文件夹中

时间:2016-12-21 16:28:32

标签: installation inno-setup privileges

我想使用下面的脚本

function InitializeSetup(): Boolean;
begin
  Result := not IsAdminLoggedOn;
  if Result then
  begin

检查用户是否是管理员。

但是,如果用户是管理员,我该怎么办,然后在A.txt中安装C:\program files\ABC,否则安装在D:\TEST

我可以写点什么来连接[Files]吗?

因为我还想在安装文件时使用检查路径,如果我可以合并[Code][Files],那么对我来说可能更容易。

我缺乏知识的借口,并提前感谢。

我试过用这个,

[Files]
Source: "..\ABC\CDE.txt"; DestDir: "{code:GetDirName}\IJK"; \
    Check: DirExists(ExpandConstant('C:\Program Files\FGH'))

但我不知道如何编写代码,如果我想在更多路径中安装更多文件。

20170109更新“这个不起作用”

function GetDirName(Param: string): string;
begin
  if IsAdminLoggedOn And DirExists(ExpandConstant('C:\ABC')) then
      begin
      Result := ExpandConstant('C:\ABC\My Program')
      end
        else
        begin
        if DirExists(ExpandConstant('C:\DEF')) then
          begin
          Result := ExpandConstant('C:\DEF\My Other Program');
          end
            else
            begin
            MsgBox('No destination found, aborting installation', mbError, MB_OK);
            end;
        end;
end;

1 个答案:

答案 0 :(得分:4)

只需实现GetDirName scripted constant即可为特权和非特权安装返回不同的路径。

[Files]
Source: "..\ABC\CDE.txt"; DestDir: "{code:GetDirName}"

[Code]

function GetDirName(Param: string): string;
begin
  if IsAdminLoggedOn then
    Result := ExpandConstant('{pf}\My Program')
  else
    Result := ExpandConstant('{localappdata}\My Program');
end;

如果要为不同的文件使用不同的文件夹,只需实现更多功能,如GetDirName。虽然差异只是关于子文件夹,但您当然可以使用一个脚本常量函数来解析公共根文件夹并将子文件夹附加到DestDir参数中。

如果要更改整体安装目标,请使用DefaultDirName directive中的GetDirName脚本常量:

[Setup]
DefaultDirName={code:GetDirName}

[Files]
Source: "..\ABC\CDE.txt"; DestDir: "{app}"

[Code]
{ The same as above }

有关更复杂的示例,请参阅Make Inno Setup installer request privileges elevation only when needed