当前位置: 首页 > 知识库问答 >
问题:

Inno Setup是否应该在更新时删除旧文件?

夏宏旷
2023-03-14

我正在使用Inno Setup安装和更新我的python应用程序。

更新时,安装程序不会删除以前安装的py文件,这会产生两个问题:

>

  • 我使用的是插件:如果我在新版本中删除了插件,它仍然适用于执行更新的用户。

    <罢工>卸载更新的安装时,将不会删除旧安装中的文件。(无法复制…)

    如何在升级之前强制Inno安装程序卸载我的应用程序?

    这是我的脚本:

    [Setup]
    AppName=Foo
    AppVersion=0.1
    PrivilegesRequired=lowest
    AppId=FooID
    RestartIfNeededByRun=False
    DefaultDirName={localappdata}\Foo
    DisableWelcomePage=True
    DisableReadyPage=True
    OutputDir=.\win
    OutputBaseFilename=setup_Foo
    AllowNoIcons=yes
    DefaultGroupName=Foo
    
    [Files]
    Source: "dist\Foo.exe"; DestDir: "{app}"
    Source: "..\*"; DestDir: "{app}\"; Flags: recursesubdirs; Excludes: "*.pyc,installer"
    
    [Icons]
    Name: "{group}\Foo"; Filename: "{app}\Foo.exe"; WorkingDir: "{app}"
    Name: "{group}\Uninstall Foo"; Filename: "{uninstallexe}"
    
    [Dirs]
    Name: "{app}\plugins"
    
    [Run]
    Filename: "{app}\Foo.exe"; WorkingDir: "{app}"; Flags: nowait postinstall
    
  • 共有2个答案

    季俭
    2023-03-14

    对于很难确定需要删除哪些旧文件、应该删除哪些旧注册表值等的用例,在安装升级之前卸载以前的版本可能更有效。如果这是您的用例,并且您使用的是Inno Setup 6或更高版本,您可以使用UninsIS.dll提供的功能先卸载现有版本:

    https://github.com/Bill-Stewart/UninsIS

    DLL提供了一些函数来确定应用程序是否已经安装,以及它是当前安装的版本的相同版本、较新版本还是较旧版本。

    山乐生
    2023-03-14

    虽然可以在升级之前运行卸载,但不建议这样做。

    相反,您应该使用 [InstallDelete] 条目来删除现在冗余的特定文件。您应该知道这些是哪些文件。

    [InstallDelete]
    Type: files; Name: {app}\foo.bar
    Type: files; Name: {app}\baz\quux.txt
    

    虽然可以使用通配符,但不建议这样做(尤其是不要忽略文件扩展名的通配符),因为它可能会无意中删除用户文件,特别是如果 {app} 在某个意外的地方(也许它们直接安装到他们的 Windows 文件夹中)。

    至于您的第二个断言,“当卸载一个更新的安装时,旧安装中的文件不会被删除。”,这根本就是不真实的。只要您保持< code>AppId和目标文件夹相同,那么卸载将卸载所有以前安装的文件,即使在更新之后。您应该使用以下设置来帮助确保这一点:

    [Setup]
    DisableDirPage=auto
    

    此外,如果您尚未发布此应用程序,则应考虑将其 DefaultDirName 更改为 {userpf}\YourAppName;这是安装每用户应用程序的更好位置。(如果已发布应用,则只要不更改 AppId,更改此值仍然是安全的,但必须记住,较旧的安装将保留在较旧的路径上。

     类似资料:
    • 问题内容: 我知道该ValueEventListener线程在新线程中运行,是否应该在任何时间删除此线程以进行适当的线程管理?(例如,没有太多并行运行的线程)。如果是,该怎么办? 问题答案: 在谈论监听器时,是的,您需要根据活动的生命周期将其删除,为此,您需要使用以下代码行: 请记住,如果不这样做,最终将浪费您的电池和带宽。所以: 如果已在中添加了侦听器,则onStart必须在中将其删除onSto

    • 我的代码有点纠结。我已经搜索并尝试了许多方法。我的目标是删除Firebase之前提供给我的应用程序的条目,Firebase数据来自嵌入式设备。我想替换android应用程序中的值。 Firebase工作正常,应用程序将显示Firebase提供的新值,但不会删除以前的条目。 我还有很多事情要做,但想在继续前进之前解决基础问题。 因此,OnChildChanged基本上会显示新的firebase条目,

    • 问题内容: 我使用以下crontab记录来每天备份数据库: 我想添加另一个crontab记录,该记录将删除早于一个月的数据库转储。 有什么想法吗? 问题答案: 只需创建另一个cron: 它将查找所有早于30天的备份并将其删除。

    • 我需要删除每天滚动的旧日志文件。要限制我尝试的文件数,请执行以下操作: 但是日志没有被删除。 现在我在尝试 但我得到了一个错误: 错误DefaultRolloverStrategy包含无效元素或属性“Delete” 我的log4j2有点问题。xml文件? 我将maven与以下内容一起使用:

    • 我使用下面的log4j2。xml 我想要的是旧的日志文件被删除,如果累积的大小超过。但是log4j2首先删除最近修改的文件。https://logging.apache.org/log4j/2.x/manual/appenders.html说有一个路径排序参数可以做到这一点。有人能告诉我如何指定相反的将逻辑排序为默认值?

    • 我正在寻找一个简单的批处理脚本,它将允许我删除旧文件并记录它是否删除了旧文件。搜索完网站后,我发现“forfiles”非常有用: 来自:批处理文件以删除超过N天的文件 正如我所说,我关心的是记录已删除的内容。我尝试了很多东西,但仍然不起作用。这是我的实际代码: 日志文件已创建,但为空,旧文件不会被删除。(它应该删除我2016年的8个文件)当我使用原始代码时,它会删除文件。我可能读过关于逃离 目标是