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;
编辑 - 这个问题似乎是 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
这是我让它发挥作用的答案。但是,请检查
我首先制作多个模块,然后将其组合在一起,使 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;