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='SOFTWARE\TempReg\Foobar' Name='FindFilePath' Win64='yes'/>
    </Property>

 

注意,默认Root 就是 Computer\HKEY_LOCAL_MACHINE,那么我们是要去这个Root下面的 SOFTWARE\TempReg\Foobar,读取 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 对应的语句执行

posted @ 2020-01-09 21:50  内心澎湃的水晶侠  阅读(1498)  评论(0编辑  收藏  举报