• 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 对应的语句执行

  • 相关阅读:
    一些基本数据类型问题
    File创建
    zip解压文件java
    Arrays 的copyOf()
    浏览器客户端-自定义服务端
    TCP并发复制上传文件
    TCP传输过程复制文件
    TCP通讯
    TCP通讯
    css3 animation
  • 原文地址:https://www.cnblogs.com/chenyingzuo/p/12173707.html
Copyright © 2020-2023  润新知