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

Inno Setup替换文件后未更新文件时间戳的技术问询

Inno Setup替换文件后时间戳未更新问题

使用Inno Setup安装文件时,发现被替换的文件没有同步新文件的时间戳。安装日志显示文件已成功替换,但目标文件仍保留旧文件的日期/时间,无法确认文件是否实际完成替换。

InnoSetupTest.iss

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "InnoSetupTest"
#define MyAppVersion "1.0"
#define MyAppPublisher "InnoSetupTest"
#define MyAppExeName "InnoSetupTest.exe"
#define MyAppDir "AutoTrader"

[Setup]
;SignTool=mystandard
;SignedUninstaller=yes
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
ArchitecturesInstallIn64BitMode=x64
AppId={{BA5DEA98-E5E3-4DC4-BB72-94005FE539FC}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={autopf}\{#MyAppPublisher}\{#MyAppName}
UninstallDisplayIcon={app}\{#MyAppExeName}
OutputBaseFilename={#MyAppName}_installer
OutputDir=.
;Uncomment the following line to run in non administrative install mode (install for current user only.)
;PrivilegesRequired=lowest
DisableDirPage=yes
DisableProgramGroupPage=yes
PrivilegesRequired=admin
SolidCompression=yes
WizardStyle=modern
SetupLogging=yes

[Files]
Source: "InnoSetupTest.exe"; DestDir: "{sd}\{#MyAppDir}"; Flags: ignoreversion replacesameversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
; if not ShellExec('Print', '{app}\STE_license.txt', '', '', SW_SHOW, ewNoWait, ResultCode) then

InnoSetup日志文件

2024-06-20 05:28:07.377   日志已打开。(时区: UTC-05:00)
2024-06-20 05:28:07.378   安装程序版本: Inno Setup version 6.2.0
2024-06-20 05:28:07.378   原始安装程序EXE: C:\InnoSetupTest\InnoSetupTest_installer.exe
2024-06-20 05:28:07.378   安装程序命令行: /SL5="$660D80,1288873,831488,C:\InnoSetupTest\InnoSetupTest_installer.exe" /SPAWNWND=$680EDC /NOTIFYWND=$190D7A 
2024-06-20 05:28:07.378   兼容模式: 是 (安装程序)
2024-06-20 05:28:07.378   Windows版本: 10.0.22000  (NT平台: 是)
2024-06-20 05:28:07.378   64位Windows: 是
2024-06-20 05:28:07.378   处理器架构: x64
2024-06-20 05:28:07.378   用户权限: 管理员
2024-06-20 05:28:07.380   管理员安装模式: 是
2024-06-20 05:28:07.380   安装模式根键: HKEY_LOCAL_MACHINE
2024-06-20 05:28:07.380   64位安装模式: 是
2024-06-20 05:28:07.388   创建临时目录: C:\Users\email\AppData\Local\Temp\is-JPNJU.tmp
2024-06-20 05:28:12.271   发现1个需要注册到RestartManager的文件。
2024-06-20 05:28:12.271   调用RestartManager的RmGetList。
2024-06-20 05:28:12.279   RmGetList执行成功。
2024-06-20 05:28:12.279   RestartManager未发现任何正在使用我们文件的应用程序。
2024-06-20 05:28:12.296   开始安装过程。
2024-06-20 05:28:12.299   卸载文件目录: C:\Program Files\InnoSetupTest\InnoSetupTest
2024-06-20 05:28:12.299   将追加到现有卸载日志: C:\Program Files\InnoSetupTest\InnoSetupTest\unins000.dat
2024-06-20 05:28:12.302   -- 文件条目 --
2024-06-20 05:28:12.302   目标文件名: C:\Program Files\InnoSetupTest\InnoSetupTest\unins000.exe
2024-06-20 05:28:12.302   非默认位数: 32位
2024-06-20 05:28:12.305   我们文件的时间戳: 2024-06-20 05:28:07.235
2024-06-20 05:28:12.305   目标文件已存在。
2024-06-20 05:28:12.305   现有文件的时间戳: 2024-06-20 05:25:17.340
2024-06-20 05:28:12.305   我们文件的版本: 51.1052.0.0
2024-06-20 05:28:12.306   现有文件的版本: 51.1052.0.0
2024-06-20 05:28:12.306   正在安装文件。
2024-06-20 05:28:12.312   暂时保留临时文件。
2024-06-20 05:28:12.313   -- 文件条目 --
2024-06-20 05:28:12.313   目标文件名: C:\AutoTrader\InnoSetupTest.exe
2024-06-20 05:28:12.314   我们文件的时间戳: 2024-06-20 05:27:58.000
2024-06-20 05:28:12.314   目标文件已存在。
2024-06-20 05:28:12.314   现有文件的时间戳: 2024-06-20 05:25:06.000
2024-06-20 05:28:12.314   正在安装文件。
2024-06-20 05:28:12.351   文件安装成功。
2024-06-20 05:28:12.352   保存卸载信息。
2024-06-20 05:28:12.352   重命名卸载程序。
2024-06-20 05:28:12.352   删除之前管理员64位安装遗留的卸载键。
2024-06-20 05:28:12.353   创建新的卸载键: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\{BA5DEA98-E5E3-4DC4-BB72-94005FE539FC}_is1
2024-06-20 05:28:12.353   写入卸载键值。
2024-06-20 05:28:12.354   检测到之前的非管理员安装? 否
2024-06-20 05:28:12.354   检测到之前的管理员32位安装? 否
2024-06-20 05:28:12.357   安装过程成功。
2024-06-20 05:28:12.362   需要重启Windows? 否
2024-06-20 05:28:13.369   正在初始化安装程序。
2024-06-20 05:28:13.376   日志已关闭。

问题原因与解决办法

原因分析

从日志可以看到,新旧文件的版本号均为51.1052.0.0,而你使用了replacesameversion参数。Inno Setup的默认行为是:当版本号相同时,替换文件但保留原文件的时间戳,以此避免不必要的时间戳变更。这就是为什么日志显示替换成功,但时间戳没更新的原因。

解决办法

1. 强制替换并同步时间戳

把[Files]段里的replacesameversion换成replace参数:

[Files]
Source: "InnoSetupTest.exe"; DestDir: "{sd}\{#MyAppDir}"; Flags: ignoreversion replace

replace会无视版本号差异,强制替换文件并同步新文件的时间戳。

2. 保留版本判断但手动更新时间戳

如果需要保留版本判断逻辑,同时更新时间戳,可以在脚本里添加[Code]段,在安装完成后手动修改文件时间:

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  TargetPath: string;
begin
  // 安装完成后执行
  if CurStep = ssPostInstall then
  begin
    TargetPath := ExpandConstant('{sd}\AutoTrader\InnoSetupTest.exe');
    // 将文件的创建、修改、访问时间设为当前时间
    SetFileTime(TargetPath, Now, Now, Now);
  end;
end;

3. 更新源文件版本号

如果业务允许,每次发布时更新程序的版本号(比如把51.1052.0.0改成51.1053.0.0),这样Inno Setup会自动替换文件并同步新的时间戳。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:45:54