【问题标题】:Self Updating Exe par on Windows在 Windows 上自我更新 Exe par
【发布时间】:2023-03-09 12:26:01
【问题描述】:

我正在尝试创建一个脚本,当它在服务器上检测到新版本时将“自我更新”。最初我的想法是,当检测到新版本时,下载文件,然后启动一个 DOS 批处理文件,该文件只是用新的 exe 覆盖原始 exe。我想,我可以使用 sytem(start update.bat ) 然后立即退出 0; .bat 文件等待几秒钟,然后尝试删除旧的 exe。这失败了,我猜是因为即使使用 system(start ... ),新的“进程”实际上也是同一个进程,这是正确的吗?有什么方法可以在 Windows 中从 perl 启动一个全新的进程,这将允许我删除 .exe?还是有其他更好的方法?

谢谢, 埃里克·塞弗特

【问题讨论】:

    标签: windows perl par


    【解决方案1】:

    请参阅 Windows Restart Manager 上的文档,这是一种随 Windows Vista 引入的 API,用于为您管理重新启动的应用程序以获取更新。

    【讨论】:

    • 不幸的是,这是我必须处理的 XP 环境......但这听起来就像我需要的那样。
    • 如果你不能使用重启管理器,有很多hacky技术可以自删除可执行文件。 catch22.net/tuts/selfdel
    • 感谢 Adrian,那篇文章提到了我上面描述的确切技术,使用批处理文件。使用 Win32::FileOp 中的 ShellExecute 命令可以让我以我想要的方式运行它。
    【解决方案2】:

    听说过java WebStart吗?有一个 PAR 等价物,PAR::WebStart 基本上,您对其进行配置,然后从受信任的网站实时下载代码

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

    【讨论】:

      【解决方案3】:

      我知道这是一个老问题,但我想我应该把我的解决方案放在这里,因为我正在做同样的事情。你的批处理想法是我的方式,但我所做的小改动是使用exec() 而不是system(),因为前者(根据this)“......执行系统命令并且永远不会返回”,这似乎释放了正在运行的进程。当使用 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 中包含那个sn-p,它会抱怨The process cannot access the file because it is being used by another process. 我不知道为什么。由于这在我的应用程序中并不是特别重要,因此我没有追求这一点。我只是把update.bat 留在后面,让它在下次更新时被覆盖。但我没有在文件中注明可以安全删除,以防以后有人查看。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-23
        相关资源
        最近更新 更多