需求:安裝時檢測註冊表獲取已安裝軟體版本,根據版本不同複製不同檔案、建立不同捷徑。發現 WiX 無傳統 `if/else` 腳本語法,不知如何實現邏輯判斷。
WiX 使用 `
<Component Id="Cmp_File_V1" Guid="*">
<Condition><![CDATA[INSTALLED_VERSION < "2.0"]]></Condition>
<File Id="File_V1" Source="Files\V1\app.dll" KeyPath="yes" />
</Component>
<Component Id="Cmp_File_V2" Guid="*">
<Condition><![CDATA[INSTALLED_VERSION >= "2.0"]]></Condition>
<File Id="File_V2" Source="Files\V2\app.dll" KeyPath="yes" />
</Component>
<Feature Id="Feature_Legacy" Title="舊版相容" Level="1">
<Condition Level="0"><![CDATA[INSTALLED_VERSION >= "3.0"]]></Condition>
<ComponentRef Id="Cmp_Legacy_Dll" />
</Feature>
<Shortcut Id="Shortcut_V1" Name="MyApp V1" Target="[INSTALLDIR]V1\app.exe">
<Condition><![CDATA[INSTALLED_VERSION < "2.0"]]></Condition>
</Shortcut>
<Shortcut Id="Shortcut_V2" Name="MyApp V2" Target="[INSTALLDIR]V2\app.exe">
<Condition><![CDATA[INSTALLED_VERSION >= "2.0"]]></Condition>
</Shortcut>
<Property Id="INSTALLED_VERSION" Value="0">
<RegistrySearch Id="FindVersion"
Root="HKLM"
Key="Software\MyCompany\MyApp"
Name="Version"
Type="raw" />
</Property>
| 運算子 | 說明 | 範例 |
|---|---|---|
| `=`, `==` | 字串相等 | `INSTALLED_VERSION = "1.0"` |
| `<>`, `!=` | 字串不等 | `INSTALLED_VERSION <> "1.0"` |
| `<`, `>`, `<=`, `>=` | 字串字典序比較(版本號需統一格式) | `INSTALLED_VERSION >= "2.0"` |
| `AND`, `OR`, `NOT` | 邏輯組合 | `INSTALLED_VERSION >= "2.0" AND NOT VersionNT64` |
| `VersionNT` | Windows 版本主版本號 | `VersionNT >= 600` (Vista+) |
若條件極其複雜(如需呼叫 Web API、解析 JSON、比較語義版本),可編寫 **Custom Action**(C# DTF / C++ DLL),在 `InstallExecuteSequence` 中執行,設置 Property 供 `
WiX 無 `if/else`,**請用 `