天天看點

Wix 快速開發安裝包程式 (三)變量和條件判斷

在 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 對應的語句執行