如何向Inno Setup卸载程序传递自定义CLI参数?
问题描述
我希望通过向unins000.exe传递参数,预配置自定义卸载批处理脚本。安装程序的参数传递功能已实现,但卸载程序无法正常接收参数。以下是相关脚本:
Inno Setup脚本
[Run] Filename: "{app}\resources\app\Setup\install.bat"; \ Parameters: "python-3.10.7-amd64.exe {param:pysetup|standard}" [UninstallRun] Filename: "{app}\resources\app\Setup\uninstall.bat"; \ Parameters: "python-3.10.7-amd64.exe {param:ole|2} {param:defxml|2} {param:pywin|2} {param:python|2}"
注:
Run部分可正常工作(执行setup.exe /pysetuptype=...),但UninstallRun部分无法工作(执行unins000.exe /ole=... /defxml=... /pywin=... /python=...)
uninstall.bat脚本
@ECHO OFF :OLE IF "%2"=="1" GOTO :UNINOLE IF "%2"=="0" GOTO :DEFXML SET /p answer=Do you want to uninstall oletools? Y / N IF /i %answer:~,1% EQU Y GOTO :UNINOLE IF /i %answer:~,1% EQU N GOTO :DEFXML ECHO [Y]es / [N]o GOTO OLE :UNINOLE ECHO Y | pip uninstall oletools[full] ECHO. :DEFXML IF "%3"=="1" GOTO :UNINDEF IF "%3"=="0" GOTO :PYWIN SET /p answer=Do you want to uninstall defusedxml? Y / N IF /i %answer:~,1% EQU Y GOTO :UNINDEF IF /i %answer:~,1% EQU N GOTO :PYWIN ECHO [Y]es / [N]o GOTO DEFXML :UNINDEF ECHO Y | pip uninstall defusedxml ECHO. :PYWIN IF "%4"=="1" GOTO :UNINPYWIN IF "%4"=="0" GOTO :UNINPY SET /p answer=Do you want to uninstall pywin32? Y / N IF /i %answer:~,1% EQU Y GOTO :UNINPYWIN IF /i %answer:~,1% EQU N GOTO :UNINPY ECHO [Y]es / [N]o GOTO PYWIN :UNINPYWIN ECHO Y | pip uninstall pywin32 ECHO. :UNINPY IF "%5"=="1" START /WAIT %1 /uninstall /passive EXIT IF "%5"=="0" EXIT SET /p answer=Do you want to run the Setup for Python v.3.10.7 to uninstall Python? Y / N IF /i %answer:~,1% EQU Y GOTO :PYSETUP IF /i %answer:~,1% EQU N EXIT ECHO [Y]es / [N]o GOTO UNINPY :PYSETUP ECHO. ECHO python-3.10.7-amd64.exe will start now START /WAIT %1 EXIT
解决方案
核心问题是Inno Setup的{param:...}宏仅在安装阶段生效,卸载阶段无法直接读取传递给unins000.exe的参数。需要通过以下修改实现参数传递:
1. 修改Inno Setup脚本,添加卸载参数解析逻辑
在脚本中加入[Code]段,编写函数解析卸载命令行参数,替换原有的{param:...}宏:
[Run] Filename: "{app}\resources\app\Setup\install.bat"; \ Parameters: "python-3.10.7-amd64.exe {param:pysetup|standard}" [UninstallRun] Filename: "{app}\resources\app\Setup\uninstall.bat"; \ Parameters: "python-3.10.7-amd64.exe {code:GetUninstallParam|ole|2} {code:GetUninstallParam|defxml|2} {code:GetUninstallParam|pywin|2} {code:GetUninstallParam|python|2}" [Code] function GetUninstallParam(const ParamName, DefaultValue: string): string; var I: Integer; begin Result := DefaultValue; // 遍历卸载命令行参数,匹配目标参数 for I := 1 to ParamCount do begin if CompareText(Copy(ParamStr(I), 1, Length(ParamName)+1), ParamName + '=') = 0 then begin Result := Copy(ParamStr(I), Length(ParamName)+2, MaxInt); Break; end; end; end;
该函数会在卸载时自动解析unins000.exe命令行中类似/ole=1的参数,提取对应值;如果未找到目标参数,则返回预设的默认值(这里为2)。
2. 验证批处理参数接收(可选)
可以在uninstall.bat开头添加调试代码,确认参数是否正确传递:
@ECHO OFF ECHO Received parameters: %* PAUSE
执行卸载命令后,会弹出窗口显示所有接收到的参数,确认无误后可删除这段调试代码。
3. 权限注意事项
确保卸载程序以管理员权限运行,否则pip uninstall和Python卸载操作可能因权限不足失败。
内容的提问来源于stack exchange,提问作者yst_
相关产品推荐
相关产品推荐

