2012-05-03 32 views
1

我有一個NSIS安裝程序它調用卸載程序卸載舊版本。

ExecWait $INSTDIR\uninstall.exe /S _?=$INSTDIR_?開關用於使安裝程序等待卸載完成。

確實在等待卸載完成。但是,當我重新啓動我的機器時,uninstall.exe不存在於$INSTDIR下。

卸載程序部分具有使用/REBOOTOK開關刪除$INSTDIR下的一些子目錄的命令。

例:RmDir /r /REBOOTOK $INSTDIR\client

將對機器重啓被移除這項事業UNINSTALL.EXE?

回答

0

關於部署卸載程序的部分,此ExecWait聲明的位置是什麼?

卸載程序可能會刪除自己(或嘗試),並且它與與自身刪除方式相關的「新卸載程序」之間存在衝突:由於可執行文件在其執行過程中無法刪除,標記爲在下次啓動時刪除(如果使用/REBOOTOK選項)。在此之後,您正在部署「新的卸載程序」,如果它具有相同的名稱,它將在下次啓動時被刪除。

您可以嘗試使用VIAddVersionKey語句來爲新安裝程序定義與前者不同的版本。然後安裝後,檢查它是新的還是以前的unistaller。

如果您有一個HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations multi_sz值,如果在下次引導時標記爲刪除,可能包含卸載程序的名稱,那麼還請查看註冊表。

+0

感謝您的回覆。你在現場。卸載程序會在卸載過程中嘗試刪除自己 - 「Delete/REBOOTOK $ INSTDIR \ uninstall.exe」。它在運行時不能自行刪除,因此它會在重新啓動時清除新的卸載程序。再次感謝您指點我正確的方向! – gshank

+0

不客氣:o)我剛剛編輯了歷史記錄的答案,因爲我的意思是'CurrentControlSet'而不是'ControlSet001'(我的複製/粘貼失敗),不過你得到它了。 – Seki

0

/REBOOTOK的全部要刪除正在使用的文件。但RmDir /r /REBOOTOK $INSTDIR\client不應該刪除$INSTDIR\uninstall.exe,你確定你沒有RmDir /r /REBOOTOK $INSTDIR電話嗎?

無論你如何看待它,在這裏使用/ REBOOTOK可能都不是一個好主意。一旦用戶重新啓動在$ INSTDIR \客戶端的所有文件將被刪除(從舊的安裝文件和新的重新安裝)

並請註明您的路徑:

  • ExecWait '"$INSTDIR\uninstall.exe" /S _?=$INSTDIR'
  • RmDir /r /REBOOTOK "$INSTDIR\client"
+0

謝謝你的時間。正如@Seki指出的,卸載程序試圖刪除自己 - 「刪除/ REBOOTOK $ INSTDIR \ uninstall.exe」。我將卸載程序複製到一個臨時位置並從那裏運行 - ExecWait「$ INSTDIR \ temp \ uninstall.exe/S _?= $ INSTDIR」'。這樣它就可以等待,並且可以刪除'$ INSTDIR'下的舊卸載程序。是的,我完全同意REBOOTOK在這裏不是個好主意。但問題是,舊的卸載程序已經發貨了,我們無法控制它。我將刪除當前安裝程序版本中的REBOOTOK開關。 – gshank