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

如何无需setup-*.bin文件运行setup.exe /modify=1修改已安装应用?

分盘安装程序无需setup-*.bin实现组件修改的方案

方法一:做个精简版的独立修改程序(更推荐)

直接写一个只处理组件添加/移除的小型Inno Setup脚本,完全不用带原始的setup-*.bin文件。这个小程序只负责从网络拉取需要的组件,完成安装或卸载操作。

示例脚本如下:

[Setup]
AppName=你的软件名称
AppVersion=1.0
DefaultDirName={app}
AppModifyPath="{app}\ModifyTool.exe" /modify=1

[Components]
Name: "extra_component"; Description: "可选额外组件"; Types: custom

[Files]
; 引入下载用的inetc.dll,用来从网络拉取组件
Source: "inetc.dll"; DestDir: "{tmp}"; Flags: dontcopy

编译这个脚本得到ModifyTool.exe,把它放到软件安装目录{app}里,替换原来复制过去的主安装程序。用户后续要修改组件时,运行这个小工具就能直接从网络下载所需内容,完全不用依赖体积大的setup-*.bin。

方法二:给主安装程序加临时下载逻辑

如果不想额外做程序,可以在主安装脚本里加判断:当检测到/modify=1参数时,自动从网络下载setup-*.bin到临时文件夹,用完就删掉。

具体实现思路:

  • 在InitializeSetup函数里检查命令行参数,要是进入修改模式,就创建临时目录,下载所需的setup-*.bin文件到这里。
  • 把安装程序的工作目录切换到临时目录,让它能找到刚下载的bin文件。
  • 修改操作完成后,在DeinitializeSetup里删除临时目录和里面的bin文件。

代码示例(脚本的Code段):

function InitializeSetup(): Boolean;
var
  CmdLine: String;
  TempBinDir: String;
begin
  CmdLine := ExpandConstant('{cmdline}');
  if Pos('/modify=1', CmdLine) > 0 then
  begin
    TempBinDir := ExpandConstant('{tmp}\SetupTempBin');
    CreateDir(TempBinDir);
    // 这里加下载逻辑,比如用inetc组件下载setup-*.bin到TempBinDir
    // 示例:if not DownloadFile('http://你的服务器地址/setup-1.bin', TempBinDir + '\setup-1.bin') then
    // begin
    //   MsgBox('无法下载必要文件,请检查网络!', mbError, MB_OK);
    //   Result := False;
    //   Exit;
    // end;
    // 切换工作目录到临时bin目录
    SetCurrentDir(TempBinDir);
  end;
  Result := True;
end;

procedure DeinitializeSetup();
var
  TempBinDir: String;
begin
  TempBinDir := ExpandConstant('{tmp}\SetupTempBin');
  // 递归删除临时目录
  RemoveDirRecursive(TempBinDir);
end;

方法三:利用内置的网络组件机制

如果你的分盘安装已经配置了组件从网络下载(比如用Download指令或者Flags: external),那修改模式下主安装程序会自动重新从网络拉取所需组件,不用依赖本地的setup-*.bin。不过这个前提是主安装脚本本身已经做好了网络组件的下载逻辑。

内容的提问来源于stack exchange,提问作者Markus Heckmann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:10:33