在Windows上自我更新的exe

我正在尝试创build一个脚本,它将在服务器上检测到新版本时“自动更新”。 最初,我的想法是,当检测到新版本时,下载文件,然后启动一个DOSbatch file,用新文件覆盖原来的exe文件。 我想,我可以使用sytem(开始update.bat),然后立即退出0; .bat文件等待几秒钟,然后尝试删除旧的exe文件。 这个失败了,我猜是因为即使在使用系统(start …)时,新的“进程”实际上是一样的进程,这是正确的吗? 有没有办法从Windows启动一个全新的进程,这将允许我删除.exe? 还是有不同的方法会更好?

谢谢,Eric Seifert

Solutions Collecting From Web of "在Windows上自我更新的exe"

请参阅Windows 重新启动管理器上的文档,Windows 重新启动管理器是Windows Vista中引入的一个API,用于管理重新启动的应用程序,以便进行更新。

曾经听说过Java WebStart? 有一个PAR等价物,PAR :: WebStart基本上,你配置它,然后从受信任的网站下载代码

所以你的.exe只是PAR :: WebStart的前端,真正的程序从你的网站下载

我知道这是一个古老的问题,但我想我会把我的解决方案放在这里,因为我正在做同样的事情。 你的批处理的想法是我去的方式,但我做的小改变是使用exec()而不是system()因为前者(根据这个 )“…执行一个系统命令,永远不会返回 ”,这似乎释放正在运行的进程。 这似乎在使用Strawberry Perl运行解释的Perl文件时以及在使用PAR::Packer运行编译的程序时都起作用。

我已经创建了test.pl ,最终编译为test.exe ,如下所示:

 #!/usr/bin/perl use 5.10.0; use strict; use warnings; my $batch_file = <<"BATCH"; rem ### IT IS SAFE TO DELETE THIS FILE ### \@echo off ping 127.0.0.1 -n 2 -w 1000 > nul echo Copying over update file... copy testfile.exe test.exe BATCH open my $fh, '>', 'update.bat'; print $fh $batch_file; close $fh; exec( 'update.bat' ); 

testfile.exetest.exe的备用“升级版”,只是为了确保在运行时可以覆盖test.exe ,而且我可以。 ping是一种暂停2秒的方法,以确保进程在尝试覆盖文件之前有机会退出。

奇怪的是,创建的批处理文件update.bat不能删除自己,即使批处理文件可以正常删除自己。 如果我用这个创建一个批处理文件:

 start /b "" cmd /c del %0 

它会自己删除,没有任何错误。 但是,如果我在update.bat包含该片段,它会抱怨The process cannot access the file because it is being used by another process. ,所以The process cannot access the file because it is being used by another process. 我不知道为什么。 由于这在我的申请中并不特别重要,所以我没有追求这一点。 我只是留下update.bat ,并让它在下次更新时被覆盖。 但是我在文件中提到,如果有人稍后再看,那么删除它是安全的。