2010-10-07 194 views
2

我在NSIS中編寫了一個安裝程序,它是用NSIS創建的另一個安裝程序的包裝。 內部安裝程序不是我的。它使用BioWare安裝程序1.03(NSIS 2.34)創建。它可能會被打破,但我不能修改它!我的安裝程序所做的只是修改某些註冊表值(否則「內部」安裝程序將不會運行),然後執行安裝程序,然後覆蓋一些文件,然後恢復以前的註冊表值。如何執行另一個NSIS安裝程序並等待它完成?

我的問題:我不知道如何實際等待「內部」安裝程序完成!這是因爲安裝程序首先解壓縮它的內容並創建一個新的進程,這是真正的安裝程序。只要第一個進程(解包)結束,代碼就會執行。等待在這裏至關重要,因爲我需要覆蓋一些文件。

我讀過這個:http://nsis.sourceforge.net/When_I_use_ExecWait,_it_doesn't_wait,但我找不到NSIS安裝程序的任何開關。

我已經嘗試過ExecWait和nsExec :: Exec,但它們都沒有等待真正的安裝程序,只是爲了完成第一個過程。

+0

嘗試創新設置 - 我覺得它更容易使用。 – Tim 2010-10-07 20:00:26

+0

感謝您的建議,但不幸的是,Inno Setup似乎表現得相同。我使用它的Exec函數,它只等待第一個進程完成。我需要一種方式來等待所有進程 - InstallShield安裝程序爲此提供了一個開關,但是關於NSIS(使用NSIS創建的「內部」安裝程序)呢? – 2010-10-07 20:32:18

回答

1

首先,我從未見過ExecWait失敗,但它只會等待子進程,而不是該子進程的子進程。因此,供應鏈中的每個流程都需要等待其孩子。如果 「中間」 過程中被打破,嘗試http://nsis.sourceforge.net/ExecWait_and_waiting_for_child_processes_with_Job_Objects

對於ExecWait,樹看起來像:

  • NSIS1.exe:ExecWait NSIS2.exe
    • NSIS2.exe:ExecWait RealSetup.exe
      • RealSetup.exe:...

你的描述有點不清楚,你能否證實我得到了一般想法?

如果你找不到開關,用於NSIS這意味着你沒有RTFM :)

+0

是的,這就是主意。我需要在我的安裝程序(NSIS1.exe)中運行的是使用NSIS(NSIS2.exe)創建的另一個安裝程序。問題是NSIS2.exe首先解壓縮內容,然後運行RealSetup.exe。大多數典型的方法,例如ExecWait在NSIS2.exe完成解包後立即返回到代碼執行,而不是等待完成RealSetup.exe。 我做了RTFM :)你已經鏈接了相同的頁面,但據我所見,只有三個開關,其中沒有一個使安裝程序等待它的子進程(如/ SMS開關的InstallShield)。 – 2010-10-08 19:43:29

+0

我剛剛嘗試過使用Job Objects的解決方案。不幸的是,啓動NSIS2.exe後代碼執行完全凍結。從技術上講,它等待它完成,但即使在這之後 - 它不會繼續我的NSIS1.exe :)代碼遠不是人類可讀的,因此調試它將是一項非常困難的任務。目前爲止我發現的最佳解決方案是在ExecWait之後顯示一個MessageBox,要求用戶確保NSIS2.exe(和RealSetup.exe)完成。這成功地停止NSIS1.exe,但它仍然不是一個很好的解決方案。 – 2010-10-08 19:49:05

+0

我仍然不明白這個問題,除非RealSetup.exe產生子進程或其他東西。 NSIS1&2使用ExecWait對我來說工作的很好:http://nsis.pastebin.com/FSm2fLgT – Anders 2010-10-08 21:00:42

0

發現這個問題,因爲我有一個類似的問題。在我的NSIS安裝程序中,我正在下載Microsoft Visual Studio exe文件,並試圖首先安裝它(以獲得一些依賴項dll文件)。然而,這從來沒有工作過:

ExecWait "$TEMP\vcredist_x86.exe" 

它只是跳過就在 - 我懷疑,因爲與子進程的問題(也許是MS安裝程序是交互式的,並會要求用戶接受許可?)。我結束了使用ExecShellWait代替:

ExecWaitShell "open" "$TEMP\vcredist_x86.exe" 

然後我安裝將適當等待第三方安裝到結束,在移動之前。

相關問題