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.