编辑-此问题似乎是由于错误导致的Windows 7和Vista(请参阅此处-报告的问题相同)
Edit2-我可能遇到了类似的问题,用户使用PATH(我没有使用PATH,但结果相同-未回答类似问题的问题
我有一个Inno Setup脚本,它使用环境变量来定位文件夹并删除内容。当我尝试在没有提升权限的情况下扩展变量时,我得到的是:
TEST_USER=%APPDATA%\PROG\USER_DATA(在Windows中设置)
如果我以管理员身份运行(或将权限更改为管理员),我会看到:
TESTUSER=c:\users\username\appdata\漫游\PROG\USER_DATA
在谷歌上搜索%APPDATA%问题表明其他人有这个问题,通常他们在PATH中使用时会遇到这个问题,这与请求之前没有设置路径有关。
我希望避免使用pos检查返回值是否包含%appdata%的复杂例程。但我认为这可能是我唯一的解决方案。
cmd.exe-问题的示例
这是我让它发挥作用的答案。然而,请检查@Tobias81对InnoSetup的回答,扩展环境变量(使用{reg:…}从注册表值中获取),它可以工作并提供更通用的解决方案。
我先制作多个模块,然后再组合,制作一个可执行的多个组件,这样用户就可以选择一个操作。因此,我需要检查变量的当前值,而不是注册表值。另外,注册表仍然返回%APPDATA%
作为我的屏幕截图。
所以我的答案是寻找%APPDATA%
的出现并处理它
这是我的调试例程。现在我可以找到它并处理它,使我能够找到值,无论它是由父级设置的还是仅在窗口中设置的。
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;