我有一個安裝程序,可以在應用程序退出時升級以前版本的應用程序。當安裝升級模式時,我想跳過某些操作。如何確定安裝是否以升級模式運行,而不是第一次安裝模式?如何確定Windows Installer正在執行升級而不是第一次安裝?
我使用的是明智的安裝程序,但我不認爲事情。我假設Windows安裝程序具有在安裝程序處於升級模式時設置的屬性。我似乎無法找到它。如果該屬性存在,我假設我可以在條件語句中使用它。
我有一個安裝程序,可以在應用程序退出時升級以前版本的應用程序。當安裝升級模式時,我想跳過某些操作。如何確定安裝是否以升級模式運行,而不是第一次安裝模式?如何確定Windows Installer正在執行升級而不是第一次安裝?
我使用的是明智的安裝程序,但我不認爲事情。我假設Windows安裝程序具有在安裝程序處於升級模式時設置的屬性。我似乎無法找到它。如果該屬性存在,我假設我可以在條件語句中使用它。
我不知道我理解你的問題。
如果您自己正在編寫安裝腳本,那麼在Windows上最好的方法是檢查通常創建的程序的註冊表項。不像安裝目錄(和開始菜單條目等),它是一個不變的。其中一個密鑰甚至可以是軟件的版本號,以檢查用戶是否嘗試安裝舊版本(或知道是否必須刪除某些文件等)。
您可以詳細說明您使用哪種工具創建此安裝程序?
我使用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>
再往你想做什麼,你可以使用OLDIEFOUND
和NEWPRODUCTFOUND
性能取決於:
<!-- 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>
有一個稱爲Installed的MSI財產,如果每臺機器或爲當前用戶安裝該產品,將是真實的。您可以在條件布爾語句中使用它。
您還可以檢查這些MSI安裝狀態properties,如果他們中的一個會更好地工作。我從來沒有使用智者,但我認爲有一種方法來檢索這些屬性。