WIX - 引用生成的热量文件ID以在自定义操作中使用

时间:2017-06-14 20:43:12

标签: powershell wix wix3.5

Wix的新手,但是想要学习!

我正在使用热量来生成一个' directory.wxs'包含我的应用程序所需的所有文件的文件。其中一个文件是Powershell脚本,我需要将其作为自定义操作运行。我试图使用-suid标志,以便File Id在运行中保持一致。我不喜欢这个解决方案,因为如果我有两个同名的文件,我可能会有一个糟糕的方式...建议欢迎这个。

在customaction.wxs文件中,我试图使用生成的内容," install-service-filebeat.ps1"作为我的自定义操作中的属性值。我在这里和其他网站上看了很多类似的例子/问题。我可能只是一个白痴并且遗漏了一些东西,但是我想知道我的问题是引用我的directory.wxs文件中的ID,还是我的语法中的其他地方。

下面是我的脚本,我把它们包括在最后,因为它们很长。

提前致谢!

我的PS脚本:

## Powershell Script to Create MSI ##

## Variables ##

# WIX Source Dir #
$WIX_DIR="C:\Program Files (x86)\WiX Toolset v3.11\bin"

# Source Dir for files to be enumerated into MSI #
$SRC_DIR="C:\application-directory"


# Name of our Application #
$APP_NAME="Filebeat"

# Where to stage the various .wxs files #
$STG_DIR="C:\wix-project\${APP_NAME}\stage"

# Where to deliver the Final Product #
$TGT_DIR="C:\wix-project\${APP_NAME}\output"

## Create MSI ##

# Compile the source files into a Fragment to be referenced by main builder Product.wxs #
& ${WIX_DIR}\heat.exe dir $SRC_DIR -srd -dr INSTALLDIR -cg MainComponentGroup -out ${STG_DIR}\directory.wxs -ke -sfrag -gg -ssuid -var var.SourceDir -sreg -scom

# Convert the .wxs files into .wxobj for consumption by light.exe #
& ${WIX_DIR}\candle.exe -dSourceDir="${SRC_DIR}" ${STG_DIR}\*.wxs -o ${STG_DIR}\ -ext WixUtilExtension -arch x64

# Create the final MSI package --CURRENTLY REFERENCING THE FILES EXPLICITY. NEED TO FIND WAY TO WILDCARD! #
& ${WIX_DIR}\light.exe -o ${TGT_DIR}\${APP_NAME}_installer.msi ${STG_DIR}\customaction.wixobj ${STG_DIR}\directory.wixobj ${STG_DIR}\product.wixobj -cultures:en-US -ext WixUIExtension.dll -ext WiXUtilExtension.dll

这会生成我的文件,并编译它们。我的customaction.wxs的内容:

<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
 <Fragment>
 <!--Define the CustomAction for running the PowerShell script-->
<CustomAction Id="RunPowerShellScript_set"
              Property="install_service.ps1"
              Value="&quot;[\[]POWERSHELLEXE[\]]&quot; -Version 2.0 -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command &quot;&amp;'4(var.SourceDir)\[\[]#install_service.ps1[\]]'; exit $$($Error.Count)&quot;" />

 <CustomAction Id="RunPowerShellScript"
               BinaryKey="WixCA"
               DllEntry="CAQuietExec"
               Execute="deferred"
               Return="check"
               Impersonate="yes" />

  <!-- Ensure PowerShell is installed and obtain the PowerShell executable location -->
  <Property Id="POWERSHELLEXE">
    <RegistrySearch Id="POWERSHELLEXE"
                    Type="raw"
                    Root="HKLM"
                    Key="SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
                    Name="Path" />
  </Property>

  <Condition Message="This application requires Windows PowerShell.">
    <![CDATA[Installed OR POWERSHELLEXE]]>
  </Condition>

 </Fragment>
</Wix>

我的product.wxs的相关部分:

<!-- Execute Custom Action -->
        <InstallExecuteSequence>
          <Custom Action="RunPowerShellScript_set" After="InstallFiles" />
         <Custom Action="RunPowerShellScript" After="InstallFiles">
           <![CDATA[NOT Installed]]>
         </Custom>
        </InstallExecuteSequence>

1 个答案:

答案 0 :(得分:1)

我认为您的Property="install_service.ps1"不正确。尝试遵循my blog post中的模式。我希望它可以帮助你,只是再次测试我的脚本,它的工作原理。祝你有愉快的一天!