2008-09-28 65 views
4

我有一個安裝程序,可以在應用程序退出時升級以前版本的應用程序。當安裝升級模式時,我想跳過某些操作。如何確定安裝是否以升級模式運行,而不是第一次安裝模式?如何確定Windows Installer正在執行升級而不是第一次安裝?

我使用的是明智的安裝程序,但我不認爲事情。我假設Windows安裝程序具有在安裝程序處於升級模式時設置的屬性。我似乎無法找到它。如果該屬性存在,我假設我可以在條件語句中使用它。

回答

-1

我不知道我理解你的問題。
如果您自己正在編寫安裝腳本,那麼在Windows上最好的方法是檢查通常創建的程序的註冊表項。不像安裝目錄(和開始菜單條目等),它是一個不變的。其中一個密鑰甚至可以是軟件的版本號,以檢查用戶是否嘗試安裝舊版本(或知道是否必須刪除某些文件等)。

2

您可以詳細說明您使用哪種工具創建此安裝程序?

我使用Windows Installer XML(WIX)。在WIX,你可以做這樣的事情:

<!-- Property definitions --> 
    <?define SkuName = "MyCoolApp"?> 
    <?define ProductName="My Cool Application"?> 
    <?define Manufacturer="Acme Inc."?> 
    <?define Copyright="Copyright © Acme Inc. All rights reserved."?> 
    <?define ProductVersion="1.1.0.0"?> 
    <?define RTMProductVersion="1.0.0.0" ?> 
    <?define UpgradeCode="{EF9D543D-9BDA-47F9-A6B4-D1845A2EBD49}"?> 
    <?define ProductCode="{27EA5747-9CE3-3F83-96C3-B2F5212CD1A6}"?> 
    <?define Language="1033"?> 
    <?define CodePage="1252"?> 
    <?define InstallerVersion="200"?> 

,並定義升級選項:

<Upgrade Id="$(var.UpgradeCode)"> 
     <UpgradeVersion Minimum="$(var.ProductVersion)" 
       IncludeMinimum="no" 
       OnlyDetect="yes" 
       Language="$(var.Language)" 
       Property="NEWPRODUCTFOUND" /> 

     <UpgradeVersion Minimum="$(var.RTMProductVersion)" 
       IncludeMinimum="yes" 
       Maximum="$(var.ProductVersion)" 
       IgnoreRemoveFailure="no" 
       IncludeMaximum="no" 
       Language="$(var.Language)" 
       Property="OLDIEFOUND" /> 

</Upgrade> 

再往你想做什麼,你可以使用OLDIEFOUNDNEWPRODUCTFOUND性能取決於:

<!-- Define custom actions --> 
<CustomAction Id="ActivateProduct" 
      Directory='MyCoolAppFolder' 
      ExeCommand='"[MyCoolAppFolder]activateme.exe"' 
      Return='asyncNoWait' 
     Execute='deferred'/> 

<CustomAction Id="NoUpgrade4U" 
      Error="A newer version of MyCoolApp is already installed."/> 

上面定義的動作有在InstallExcecuteSequence

被限定
<InstallExecuteSequence> 
    <Custom Action="NoUpgrade4U" 
     After="FindRelatedProducts">NEWPRODUCTFOUND</Custom> 
    <Custom Action="ActivateProduct" 
     OnExit='success'>NOT OLDIEFOUND</Custom> 
</InstallExecuteSequence> 
1

有一個稱爲Installed的MSI財產,如果每臺機器或爲當前用戶安裝該產品,將是真實的。您可以在條件布爾語句中使用它。

您還可以檢查這些MSI安裝狀態properties,如果他們中的一個會更好地工作。我從來沒有使用智者,但我認爲有一種方法來檢索這些屬性。

相關問題