2 Stimmen

Selbstaktualisierende Exe-Datei unter Windows

Ich versuche, ein Skript zu erstellen, das sich selbst aktualisiert, wenn es eine neue Version auf einem Server entdeckt. Ursprünglich hatte ich die Idee, wenn eine neue Version erkannt wird, die Datei herunterzuladen und dann eine DOS-Batch-Datei zu starten, die einfach die ursprüngliche Exe mit der neuen überschreibt. Ich dachte, ich könnte sytem(start update.bat ) verwenden und dann sofort mit 0 beenden; die .bat-Datei wartet ein paar Sekunden und versucht dann, die alte Exe zu löschen. Das schlägt fehl, ich vermute, weil selbst bei Verwendung von system(start ... ) der neue "Prozess" eigentlich derselbe Prozess ist, ist das richtig? Gibt es eine Möglichkeit, einen völlig neuen Prozess aus Perl in Windows zu starten, der es mir erlaubt, die .exe zu löschen? Oder gibt es einen anderen Ansatz, der besser wäre?

Danke, Eric Seifert

2voto

Steve-o Punkte 12493

Siehe die Dokumentation zum Windows Neustart-Manager eine mit Windows Vista eingeführte API, die den Neustart von Anwendungen für Updates für Sie verwaltet.

1voto

vayay Punkte 86

Schon mal was von Java WebStart gehört? Es gibt ein PAR-Äquivalent, PAR::WebStart Im Grunde konfigurieren Sie es und laden dann den Code live von einer vertrauenswürdigen Website herunter

Ihre .exe wäre also nur ein Frontend für PAR::WebStart, während das eigentliche Programm von Ihrer Website heruntergeladen wird

1voto

Nick Coons Punkte 3660

Ich weiß, dass dies eine alte Frage ist, aber ich dachte, ich stelle meine Lösung hier rein, da ich an der gleichen Sache arbeite. Ihre Batch-Idee ist der Weg, den ich gegangen bin, aber die kleine Änderung, die ich vorgenommen habe, war die Verwendung von exec() anstelle von system() da die ersteren (nach este ) "...führt einen Systembefehl aus und kehrt niemals zurück ", was den laufenden Prozess freizugeben scheint. Dies scheint sowohl zu funktionieren, wenn interpretierte Perl-Dateien mit Strawberry Perl ausgeführt werden, als auch wenn kompilierte Programme mit PAR::Packer .

Ich habe erstellt test.pl die schließlich zu folgenden Dokumenten zusammengestellt wurde test.exe wie folgt:

#!/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 ist eine "aufgerüstete" Standby-Version von test.exe nur um sicher zu gehen, dass ich überschreiben kann test.exe während es läuft, und das kann ich. Die ping ist eine Möglichkeit, eine Pause von 2 Sekunden einzulegen, um sicherzustellen, dass der Prozess die Möglichkeit hatte, sich zu beenden, bevor er versucht, die Datei zu überschreiben.

Seltsamerweise ist die erstellte Batch-Datei update.bat kann sich nicht selbst löschen, obwohl Batch-Dateien sich normalerweise selbst löschen können. Wenn ich eine Stapeldatei mit folgendem Inhalt erstelle:

start /b "" cmd /c del %0

Es löscht sich selbst, ohne dass Fehler auftreten. Aber wenn ich dieses Snippet in update.bat beklagt sie, dass The process cannot access the file because it is being used by another process. Ich bin mir nicht sicher, warum. Da dies für meine Bewerbung nicht besonders wichtig ist, habe ich es nicht weiterverfolgt. Ich lasse einfach update.bat zurück und lässt sie bei der nächsten Aktualisierung überschreiben. Aber ich vermerke in der Datei, dass sie sicher zu löschen ist, falls jemand sie später anschaut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X