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

Inno Setup install files in different folder if the privileges is not administrator

我想使用如下脚本

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

检查用户是否是管理员。

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

我可以写点东西连接到 [Files] 吗?

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

知识匮乏请见谅,先谢谢了。

我试过用这个,

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

但是我不知道怎么写代码,如果我想在更多的路径下安装更多的文件。

20170109更新"this one doesn't work"

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;

只需实施 GetDirName scripted constant 到 return 特权和非特权安装的不同路径。

[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