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
相关产品推荐
相关产品推荐

