2011-05-12 73 views
8

我需要從中央服務器更新我的應用程序。從服務器更新EXE文件...

對於服務器安裝,應用程序會始終檢查它是否是正確的版本。

所以,當它不是,我需要它來更新自己。

那麼如何在運行EXE時複製它?我有什麼解決方案?

回答

3

正如你可以看到所有的答案,沒有一種方法來做到這一點,所以我想我會添加我們已經成功完成這一任務的方式。

  1. 我們從不直接從網絡運行應用程序。
  2. 我們從本地機器運行應用程序,並在啓動時從網絡複製。

我們使用應用程序啓動器來執行此操作。它下載一個包含應用程序文件的CRC和版本資源值的XML文件。 XML文件是在部署過程中,在FinalBuilder腳本中創建的。

然後,應用程序將XML文件與本地內容進行比較,並將需要的文件複製下來。最後我們啓動相關應用程序。這對於部署一個可爲約300名本地用戶提供服務的應用程序運行良好。最近我們從文件複製切換到HTTP下載,因爲我們發現遠程用戶斷開驅動器的問題。

我們仍然在安裝(使用Innosetup)來獲取部署基本的必需文件。

+0

這或多或少是我需要做的。我需要將應用程序部署到服務器,並且所有本地機器在啓動時都會檢查它們是否具有最新版本。但本地運行不是來自網絡。 – Jlouro 2011-05-12 21:16:08

1

您可以有一個單獨的更新可執行文件,其任務是檢查服務器版本,必要時下載更新的可執行文件,然後運行本地可執行文件。

或者您可以讓一個可執行文件以兩種不同的模式運行:1.在啓動時,檢查是否有更新(如果有),將可執行文件下載到下載目錄,運行並退出。 2.新的可執行文件會檢查它是否從安裝目錄運行,如果不是,它將在那裏複製它自己,覆蓋舊版本,從那裏開始複製並退出。

4

我將當前運行的exe文件重命名爲MyTempExe.exe,將新的exe文件複製到正確的位置(如果需要請求提升權限),然後運行單獨的應用程序以重新啓動主應用程序。在啓動時,我檢查MyTempExe.exe刪除它,如果它在那裏。

我使用單獨的應用程序重新啓動的原因是我沒有設置應用程序關閉的時間範圍,需要等待它完成它正在執行的任何操作,在關機時將信息寫入磁盤它目前的狀態是更新後的應用程序將用於恢復舊的應用程序停止的地方。

我不知道這是最好的解決方案,但它是我使用的。

+0

好的。如果它正在運行,你如何重命名exe文件? – Jlouro 2011-05-12 14:11:35

+0

@Jlouro我只是使用RenameFile,我不認爲有重命名的限制,只有在刪除。 – 2011-05-12 14:14:26

+0

好的。去嘗試一下。謝謝 – Jlouro 2011-05-12 15:08:45

2

我自己使用TMS TWebUpdate進行軟件更新。優點是,如果您需要純粹的EXE更新以外的任何其他操作,則可以將其放入腳本中。

3
  • 下載新的EXE到TEMP
  • 從EXE創建批次,含量:

taskkill /PID %process id of running EXE%

copy %new EXE% %running EXE%

%EXE%

  • 箇中所有%...值%的佔位符
  • 從運行EXE
  • 刪除批量
+0

感謝我認爲結合數據庫,這可以是一個實施更新的強大方式 – AirWolf 2014-02-12 20:55:48

+0

1)我不知道PPID時使用了命令taskkill和/ IM 2)使用start命令來防止批處理文件等待程序 3)刪除批處理文件 – Mohamad 2015-04-04 06:41:17

3

包裝你的應用程序使用安裝程序,如創新科技執行批處理。下載並執行安裝程序。讓安裝程序搜索並終止您的應用程序,或指示用戶關閉它。該安裝程序將替換您的.exe文件,如果該應用程序不能被殺死或用戶不合作,它將發出重新啓動通知。

+0

+1我認爲這適用於UAC(如果您打電話給安裝程序setup.exe)。 – 2011-05-13 06:47:30

1

我的方式是另一種方式:如果新版本在線,請提示用戶更新。如果他想(或被迫......)我結束應用程序,並開始一個新的exe(更新)。此更新程序加載更新並替換舊的exe(未運行)。然後它啓動新的exe。準備。(你當然也可以替換其他文件。)但是:使用像InnoSetup這樣的安裝程序會給你更多的可能性,並且不會與常規卸載程序混淆,所以它真的更好...

2

我有兩個組件處理應用程序可執行文件本身以及提供版本詳細信息和文件下載的Web服務(SOAP)。

應用程序在SOAP服務上調用一個方法來詢問項目中的文件數量(通常使用application.exename標識項目)。

SOAP服務會從一個INI文件,其具有像條目其信息:

[項目]

NumberOfFiles的= 2

文件1 = MyApp.exe的; 1.0.0.1

文件2 = MYDLL.DLL; 1.0.0.2

您只需在上傳新文件的同時更新此文件。

更新應用程序的過程如下:

上的Web服務

  • 對於每個文件可用文件

    1. 獲取數量,應用程序請求從SOAP服務器的名稱和版本號。

    2. 應用程序將此信息與其自己的版本信息進行比較,並確定文件是否需要更新,以生成需要更新的文件的本地列表。

    3. 對於需要更新的應用程序的每個文件下載到filename.ext.new

    4. 最後的文件,應用程序重命名所有FILENAME.EXT到filename.ext.old和filename.ext.new重命名爲filename.ext然後重新啓動。 (沒有真正需要外部應用程序來重新啓動自己的程序)。

    注意1,您可能不得不要求提升以替換文件,具體取決於您安裝文件的位置。注意2:對用戶友善,在用戶強制更新之前仔細考慮。

    注意3:您不能刪除正在運行的exe文件,但可以重命名它,然後重新啓動新版本。

    編輯===

    對於一些參考的數據文件不能包含版本信息資源,你可以有一個像File99 = MyDataFile entires; 2011年1月1日的3種元素的版本號表示到客戶端,它應檢查文件日期/戳記。

  • 0

    您可以在不運行其他應用程序的情況下執行此操作。運行時將更新從服務器推送到客戶端,並存儲在客戶端的臨時目錄中。如果要升級,請將所有正在運行的文件移動到另一個臨時目錄,將新文件移動到原始應用程序目錄中,然後在關機時使用標準可執行文件名重新啓動應用程序。

    我以這種方式自動升級在無人值守機器上運行的客戶端應用程序。