在 wix 中經常使用變量和條件判斷,在這裡也做一個總結
一、 變量
1. installer 變量
windows 安裝包的關鍵字,它的值是需要推遲到安裝包在使用者的機器,安裝中才能确定并指派的
舉例,我們之前寫的這句話
<Property Id="USER32VERSION">
<DirectorySearch Id="SystemFolderDriverVersion" Path="[SystemFolder]">
<FileSearch Name="user32.dll" MinVersion="6.0.6001.1750"/>
</DirectorySearch>
</Property>
注意 [SystemFolder] 這個值實際就是使用者機器上系統檔案夾的位置
參考微軟文檔:
[xxx] 這種寫法的含義,https://docs.microsoft.com/en-us/windows/win32/msi/formatted?redirectedfrom=MSDN
更多的系統關鍵字,請參照 https://docs.microsoft.com/en-us/windows/win32/msi/property-reference?redirectedfrom=MSDN#feature-installation-options-properties
再舉一個例子,自定義一個安裝變量,它的值在安裝中從系統資料庫裡讀取
<Property Id="MYTESTVAR">
<RegistrySearch Id='AcmeFoobarRegistry' Type='raw' Root='HKLM' Key='SOFTWARETempRegFoobar' Name='FindFilePath' Win64='yes'/>
</Property>
注意,預設Root 就是 ComputerHKEY_LOCAL_MACHINE,那麼我們是要去這個Root下面的 SOFTWARETempRegFoobar,讀取 FindFilePath 變量的值
提前在系統資料庫裡,寫好這個值
安裝中的日志可以發現,成功讀取到系統資料庫的值了
接着延伸一下,再寫一個自定義變量,這個變量先從上面的 變量 MYTESTVAR 拿到了值,也就是一個路徑以後,我們想是在這個路徑下,看一看有沒有一個叫 MyTargetKey.txt 的檔案
<Property Id="FILEEXISTS">
<DirectorySearch Id="CheckFileDir" Path="[MYTESTVAR]" Depth="0">
<FileSearch Id="CheckFile" Name="MyTargetKey.txt" />
</DirectorySearch>
</Property>
如果提前放好這個檔案,如下:
觀察日志,寫的很清楚,會把完整的檔案路徑複制給變量 FILEEXISTS
但是如果沒有這個檔案,自然也就不會為這個變量指派了。
2. Wix 變量
Wix提供的變量,寫法基本是 $(xxx),它是wix工程在編譯過程中就會被替換的變量。
一共有三種變量:
1. $(env.xxx)
xxx 是編譯機器上的環境變量名稱
2. $(sys.xxx)
xxx 是wix 提供的變量,如 CURRENTDIR 就是目前wix檔案所在的目錄
3. $(var.xxx)
使用者自己定義的變量,如:<?define test = “Hello World” ?>, 後面即可使用 $(var.test) 引用這個變量的值
變量定義時也可以使用别的變量的值,如:<?define testNew = “$(var.test) aaa” ?>
二、條件編譯
1. installer 條件
條件安裝,在安裝過程中,根據使用者機器的實際條件,決定是否安裝
例如,我想必須是管理者才能安裝,不是管理者彈出一個消息
You need to be an administrator to install this product.
<!--必須是管理者才允許安裝-->
<Condition Message="You need to be an administrator to install this product.">
Privileged
</Condition>
再比如,使用者機器必須是 win8 才能安裝
<!--機器是win8,才允許安裝-->
<Condition Message='windows is not win8, can not install'>VersionNT = 602</Condition>
兩條分開寫,安裝中依次的判斷,走到哪個條件不滿足了,就會停止安裝。
也可以把兩條合在一起寫,然後用 And 連接配接起來
<!--必須要管理者, 并且機器是win8,才允許安裝-->
<Condition Message="First use admin, then your computer should be win8. Othervise, can not install">
Privileged AND VersionNT = 602
</Condition>
那麼我們怎麼知道有哪些内置的關鍵字可以使用呢?
請參考文檔:
https://docs.microsoft.com/zh-cn/windows/win32/msi/property-reference?redirectedfrom=MSDN#operating_system_properties
還可以判斷變量值是否不為空,比如前面自定義的一個變量,FILEEXISTS
如果存在檔案,再安裝第二部分的元件
<Feature Id='Complete' Level='1'>
<Feature Id='MainProgram' Level='1'>
<ComponentRef Id='MainExecutable' />
</Feature>
<Feature Id='Documentation' Level='0'>
<ComponentRef Id='Manual' />
<Condition Level="1">FILEEXISTS</Condition>
</Feature>
</Feature>
PS:有些時候,寫條件時會用到一些特殊字元,如 > <,這時候需要把它包在一個 CDATA 裡面。
<Condition Message='This installation can only run in full UI mode.'>
<![CDATA[UILevel = 5]]>
</Condition>
2. wix 條件
在wix 編譯中,根據不同條件,執行不同的操作。
<?define aa =3 ?>
<?if $(var.aa) > 10 ?>
xxx1
<?elseif $(var.aa) > 8 ?>
xxx2
<?if $(var.aa) > 3 And $(var.aa) < 5?>
xxx3
<?else?>
xxx4
<?endif?>
以上根據不同條件,選擇 xxx 對應的語句執行