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

时间:2016-06-03 21:04:36

标签: global-variables environment-variables inno-setup

修改 - 由于错误(see here - Same issue reported)

,此问题似乎是Windows 7和Vista

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

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

TEST_USER =%APPDATA%\ PROG \ USER_DATA(在Windows中设置)

如果我以管理员身份运行(或更改管理员权限),我会看到:

TESTUSER = c:\ users \ username \ appdata \ roaming \ PROG \ USER_DATA

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

如果返回值包含%appdata%,我希望避免使用pos检查复杂的例程。但我认为这可能是我唯一的解决方案。

cmd.exe - Example of the issue

1 个答案:

答案 0 :(得分:1)

这是我使其成功的答案。不过,请查看@Tobias81InnoSetup, expand environment variable (taken from registry value using {reg:...} )的答案,该答案有效并提供更通用的解决方案。

我先制作多个模块,然后再组合制作一个包含多个组件的可执行文件,以便用户可以选择一个动作。因此,我需要检查变量的当前值而不是注册表值。此外,注册表仍会返回%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;