Inno Setup - 完全解析包含另一个变量的环境变量

Inno Setup - Fully resolve an environment variable that contains another variable

编辑 - 这个问题似乎是 Windows 7 和 Vista 由于错误 (see here - Same issue reported)

Edit2 - 我可能会 运行 遇到类似的问题用户 wee 使用 PATH(我没有使用 PATH 但结果相同 - Unanswered question with similar issues

我有一个 Inno Setup 脚本,它使用环境变量来定位文件夹并删除其中的内容。当我尝试在没有提升权限的情况下扩展变量时,我得到了这个:

TEST_USER=%APPDATA%\PROG\USER_DATA(这个是在Windows中设置的)

如果我 运行 作为管理员(或将权限更改为管理员),我会看到:

TESTUSER=c:\users\用户名\appdata\roaming\PROG\USER_DATA

谷歌搜索 %APPDATA% 问题显示其他人也有这个问题,通常他们在 PATH 中使用时会遇到这个问题,这与在请求之前未设置路径有关。

我希望避免使用 pos 检查 return 值是否包含 %appdata% 的复杂例程。但我认为这可能是我唯一的解决办法。

cmd.exe - Example of the issue

这是我让它发挥作用的答案。但是,请检查 to 的答案是否有效并提供更通用的解决方案。


我首先制作多个模块,然后将其组合在一起,使 1 个可执行文件具有多个组件,这样用户就可以 select 执行一个操作。因此,我需要检查变量的当前值而不是注册表值。加上注册表仍然是 returns %APPDATA% 作为我的屏幕截图。

所以我的答案就是寻找%APPDATA%的出现并处理它。

这是我的调试例程。现在我可以找到它并处理它,无论它是由父级设置还是仅在 windows.

中设置,我都可以找到该值
procedure InitializeWizard;
var
  test_user: string;
  app_user: string;
  folder_to_find: string;
begin
  test_user := (ExpandConstant('{%TEST_USER}'));
  app_user := (ExpandConstant('{%APPPDATA}'));
  if (test_user <> '') AND (Pos(Uppercase('%APPDATA%'), Uppercase(test_user))=0) then
  begin
    folder_to_find := test_user;
    MsgBox('Folder found : ' + folder_to_find + ' APPDATA STRING WAS NOT DETECTED', mbInformation, MB_OK)
  end
    else
  if (test_user <> '') AND (Pos(Uppercase('%APPDATA%'), Uppercase(test_user))=1) then 
  begin
    StringChangeEx(test_user, '%APPDATA%', '', True);
    folder_to_find := app_user + test_user;
    MsgBox('Folder found : ' + folder_to_find + ' APPDATA STRING WAS DETECTED & REMOVED!', mbInformation, MB_OK);
  end
    else
  begin
    MsgBox('The TEST_USER Environment is not set' + #13#10#13#10 + 'This process will now exit!',mbInformation, MB_OK)
    Abort;
  end;
end;