如何让Inno Setup按指定路径操作System32/SysWow64文件夹
解决Inno Setup中System32/SysWow64路径重定向问题,实现Windows计算器替换与还原
我完全懂你的 frustration——Windows 的文件系统重定向机制简直是个"隐形推手",32位程序碰System32就自动转去SysWow64,哪怕写死绝对路径都没用。下面是一套精准控路的方案,完美适配你的需求:替换Win10计算器为Win7版本、权限修改、卸载还原,全程严格指向64位System32文件夹。
核心破局点:关闭重定向+启用64位安装模式
Inno Setup默认是32位程序,天生会被Windows的文件系统重定向影响。要彻底解决,得从两个层面下手:
1. 强制以64位模式运行安装包
在脚本的[Setup]段加以下配置,让安装程序在64位系统上以64位进程启动,此时{sys}就直接指向真正的C:\Windows\System32:
[Setup] ; 仅在x64系统上启用64位安装模式 ArchitecturesInstallIn64BitMode=x64 ; 必须要求管理员权限,否则碰不了系统文件 PrivilegesRequired=admin ; 强制禁用文件系统重定向(64位模式下默认已禁用,但加上更保险) DisableFsRedirection=yes
2. 手动控重定向(针对自定义脚本/命令)
如果你的脚本里有自定义Pascal代码或外部命令,偶尔还是出现重定向"漏网",可以手动在操作前后开关重定向:
procedure CurStepChanged(CurStep: TSetupStep); var OldState: Boolean; begin if CurStep = ssInstall then begin // 先禁用重定向 OldState := DisableFsRedirection; try // 在这里执行你的System32文件操作,比如复制、改权限 FileCopy(ExpandConstant('{src}\calc_win7.exe'), ExpandConstant('{sys}\calc.exe'), False); finally // 操作完恢复原重定向状态 EnableFsRedirection(OldState); end; end; end;
完整实现流程(计算器替换+权限+卸载还原)
步骤1:先备份原Win10计算器
安装前把原calc.exe存到安装目录,方便卸载时还原:
[Files] ; 备份System32下的原计算器到{app}备份文件夹 Source: "{sys}\calc.exe"; DestDir: "{app}\backup"; Flags: external skipifsourcedoesntexist ; 把Win7版本计算器放到临时目录备用 Source: "calc_win7.exe"; DestDir: "{tmp}"; Flags: dontcopy
步骤2:替换计算器并修改权限
用[Run]段执行命令替换文件,同时设置普通用户能运行的权限:
[Run] ; 替换System32下的计算器(64位模式下{sys}就是真正的System32) Filename: "cmd.exe"; Parameters: "/c copy /y ""{tmp}\calc_win7.exe"" ""{sys}\calc.exe"""; Flags: runhidden ; 给替换后的计算器加全用户执行权限 Filename: "icacls.exe"; Parameters: """{sys}\calc.exe"" /grant Everyone:F"; Flags: runhidden
步骤3:卸载时还原原计算器
在[UninstallRun]段把备份的原文件复制回去,恢复系统默认状态:
[UninstallRun] ; 把备份的原计算器还原回System32 Filename: "cmd.exe"; Parameters: "/c copy /y ""{app}\backup\calc.exe"" ""{sys}\calc.exe"""; Flags: runhidden ; 恢复原文件权限(可选,根据实际需求调整) Filename: "icacls.exe"; Parameters: """{sys}\calc.exe"" /reset"; Flags: runhidden
踩坑提醒
- 确保你用的Win7版本
calc.exe是64位的,不然替换后64位系统可能跑不起来。 - 测试时一定要右键"以管理员身份运行"安装包,哪怕你是管理员账户,UAC会拦系统文件修改。
- 建议用最新版Inno Setup 6.x,老版本对64位模式的支持可能有bug。
内容的提问来源于stack exchange,提问作者Ralph
相关产品推荐
相关产品推荐

