Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何实现自动更新检测模型_Windows_Installation_Automation - Fatal编程技术网

Windows 如何实现自动更新检测模型

Windows 如何实现自动更新检测模型,windows,installation,automation,Windows,Installation,Automation,我们的软件从未正式安装在Windows上,目前有如下更新模式: 连接到Internet 单击更新按钮 连接到服务器端程序 服务器端程序创建一个md5哈希列表,其中包含所有文件 服务器程序目录 客户端程序创建一个md5哈希列表,其中包含 客户端程序目录 进行比较以查看文件是否需要更新、删除或添加 到客户机的机器,直到完成 好吧,我想换一种模式,我看到现在使用得更频繁,在这种模式下,软件被正式安装,类似的事情发生了: 当检测到internet连接时,程序将自动查询 服务器以查看是否有更新的安装包 如

我们的软件从未正式安装在Windows上,目前有如下更新模式:

  • 连接到Internet

  • 单击更新按钮

  • 连接到服务器端程序

  • 服务器端程序创建一个md5哈希列表,其中包含所有文件 服务器程序目录

  • 客户端程序创建一个md5哈希列表,其中包含 客户端程序目录

  • 进行比较以查看文件是否需要更新、删除或添加 到客户机的机器,直到完成

  • 好吧,我想换一种模式,我看到现在使用得更频繁,在这种模式下,软件被正式安装,类似的事情发生了:

  • 当检测到internet连接时,程序将自动查询 服务器以查看是否有更新的安装包

  • 如果是,请询问用户是否要下载新安装

  • 如果否,则不执行任何操作;如果是,则下载新安装

  • 以编程方式卸载旧程序并开始安装 新包装

  • 我需要建议的部分是上面的第4部分。在运行原始程序的同时,以编程方式卸载旧程序并开始安装新程序的最佳方法是什么。我假设一定有一些中间程序来完成所有工作(关闭当前程序,运行卸载程序,然后启动新的安装程序),有更好的方法吗?我只想转移到一种模式,在这种模式下,我们更新的是完整的安装,而不仅仅是文件-这将允许我们更容易地版本我们的软件,并保持自包含的安装在任何时候恢复到

    谢谢你的建议


    编辑:相关问题-找到特定安装的安装UUID的最简单方法是什么?

    我这样做的方式是使用一个单独的程序(我们称之为StartUp.exe),该程序检查更新,然后加载真正的软件(我们称之为program.exe)。StartUp.exe与Program.exe具有相同的图标,是桌面快捷方式和菜单项指向的可执行文件,使用与Program.exe相同的名称

    所以序列是这样的:

  • 用户双击桌面快捷方式或菜单项,该快捷方式或菜单项看起来像Program.exe,名称相同,但实际上是StartUp.exe
  • StartUp.exe运行并检查是否有任何更新
  • 如果有更新,它只需复制,然后跨越(我们构建了一个带有进度条的不错的系统,但您可以简单地将新文件复制到旧文件上)
  • StartUp.exe然后运行Program.exe
  • StartUp.exe然后退出
  • 这样做的好处是,没有任何程序文件被锁定,因为加载程序实际上是一个不同的程序。用户一点也不聪明,因为他们运行的程序看起来和他们想要运行的程序一样,并且被称为相同的程序,最终结果是他们想要运行的程序,并且保证是最新的版本

    使用更新按钮进行更新会更加复杂,但我们需要强制程序的最新版本运行(由于版本之间的数据库差异),因此在启动时强制更新对我们来说是可行的


    我相信现在的方法是使用部署,但我从来没有尝试过——在我编写系统时,它是不可用的,而且这种方法很简单,效果很好

    听起来你很了解情况。有些人已经把一个更新程序存根放在一起,你称之为中介,他们从待更新的应用程序启动。它运行msiexec/u来卸载旧的东西,然后可以运行新下载的安装程序。不过,在某个时候,它会退出,需要有人在某处删除该更新程序存根exe。