You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:35:36