2

サーバー上で新しいバージョンを検出したときに「自己更新」するスクリプトを作成しようとしています。当初、私が考えていたのは、新しいバージョンが検出されたときにファイルをダウンロードし、元のexeを新しいexeで単純に上書きするDOSバッチファイルを開始することでした。system(start update.bat ) を使用してすぐに 0; を終了できると思いました。.bat ファイルは数秒間待機してから、古い exe を削除しようとします。これは失敗します。system(start ... ) を使用していても、新しい「プロセス」は実際には同じプロセスなので、これは正しいですか? Windows で perl からまったく新しいプロセスを起動して、.exe を削除する方法はありますか? それとも、より良い別のアプローチがありますか?

ありがとう、エリック・ザイフェルト

4

3 に答える 3

2

更新プログラムについては、 Windows Vista で導入された、アプリケーションの再起動を管理する API である Windows Restart Managerのドキュメントを参照してください。

于 2011-05-18T20:25:16.190 に答える
1

Java WebStart について聞いたことがありますか? PAR に相当する PAR::WebStart があります。基本的には、構成してから、信頼できる Web サイトからライブでコードをダウンロードします。

したがって、.exe は PAR::WebStart のフロントエンドに過ぎず、実際のプログラムは Web サイトからダウンロードされます。

于 2011-08-13T19:43:54.427 に答える
1

私はこれが古い質問であることを知っていますが、私は同じ種類のことに取り組んでいるので、ここに私の解決策を置くと思いました. あなたのバッチのアイデアは私が行った方法ですが、私が行った小さな変更は、前者(thisによると)「...システムコマンドを実行し、決して返さない」ため、実行中のプロセスを解放するように見えるexec()代わりに使用することでした。これは、解釈された Perl ファイルを Strawberry Perl で実行する場合と、コンパイルされたプログラムを で実行する場合の両方で機能するようです。system()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.これは私のアプリケーションでは特に重要ではないので、追求していません。置き去りupdate.batにして、次に更新が発生したときに上書きされるようにします。ただし、後で誰かが見た場合に備えて、削除しても安全であることをファイルに記録しています。

于 2015-05-23T21:49:45.757 に答える