Самостоятельное обновление Exe par в Windows - PullRequest
2 голосов
/ 18 мая 2011

Я пытаюсь создать скрипт, который будет "самообновляться" при обнаружении новой версии на сервере.Первоначально у меня была идея, что при обнаружении новой версии загрузите файл, а затем запустите командный файл DOS, который просто перезаписывает исходный exe-файл новым.Я подумал, что мог бы использовать sytem (start update.bat) и сразу же выйти из 0;Файл .bat ждет пару секунд, а затем пытается удалить старый exe.Я полагаю, что это не удается, потому что даже при использовании системы (запуск ...) новый «процесс» фактически является тем же процессом, верно?Есть ли способ запустить совершенно новый процесс из Perl в Windows, что позволило бы мне удалить .exe?Или есть другой подход, который был бы лучше?

Спасибо, Эрик Сейферт

Ответы [ 3 ]

2 голосов
/ 19 мая 2011

См. Документацию по Windows Менеджер перезапуска , API, представленный в Windows Vista, который управляет перезапуском приложений, для обновлений, для вас.

1 голос
/ 24 мая 2015

Я знаю, что это старый вопрос, но я решил поставить свое решение здесь, так как я работаю над тем же. Ваша идея с пакетом - мой путь, но небольшое изменение, которое я сделал, заключалось в использовании exec() вместо system(), так как первый (согласно this ) "... выполняет системную команду и никогда не возвращает", что, похоже, освобождает запущенный процесс. Похоже, что это работает как при запуске интерпретированных файлов Perl со Strawberry 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.exe является резервной «обновленной» версией test.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. Я не уверен, почему. Поскольку это не особенно важно в моем приложении, я не преследовал это. Я просто оставляю update.bat и позволяю перезаписать его при следующем обновлении. Но я отмечаю в файле, что его можно безопасно удалить, если кто-нибудь взглянет на него позже.

1 голос
/ 13 августа 2011

Вы когда-нибудь слышали о Java WebStart? Существует эквивалент PAR, PAR :: WebStart По сути, вы настраиваете его, а затем загружаете код в прямом эфире с надежного веб-сайта

так что ваш .exe будет просто интерфейсом для PAR :: WebStart, с реальной программой, скачанной с вашего сайта

...