PowerShell Wix Extension
I've looked, but I couldn't find anyone who'd implemented a Wix Extension that would allow running PowerShell scripts. So I've spent a few hours this weekend writing one (and learned a bit more about Wix and MSIs along the way).
This extension allows you to run script from a file that is included in the MSI, or inline script (inside a CDATA section)
By hosting PowerShell in the custom actions, scripts also get access to the $session
variable (which is of type Microsoft.Deployment.WindowsInstaller.Session
), so you can call $session.Log("Running this") and it will add "Running This" to the MSI log!
Here's an example of what you can do:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:powershell="http://schemas.gardiner.net.au/PowerShellWixExtensionSchema">
<Product Id="*" Name="PowerShellWixTest" Language="1033" Version="1.0.0.0" Manufacturer="David Gardiner" UpgradeCode="c61298af-d8c9-4179-903f-f42fa69b59ad">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="PowerShellWixTest" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
<powershell:File Id="PSFile1" File="[#TestPs1]" Arguments=""First Argument" 2"/>
<powershell:Script Id="Script2">
<![CDATA[
# Write-Host "Number 2";
for ($i = 1; $i -le 100; $i++)
{
Write-Progress -Activity "Activity" -Status "Status $i% complete" -CurrentOperation "Operation $i" -PercentComplete $i
Start-Sleep -Milliseconds 5
}
]]>
</powershell:Script>
<UI>
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<Property Id="WixUI_Mode" Value="Minimal" />
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FatalError" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="ProgressDlg2" />
<DialogRef Id="UserExit" />
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
<Property Id="ARPNOMODIFY" Value="1" />
</UI>
<UIRef Id="WixUI_Common" />
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="PowerShellWixTest" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Id="ProductComponent">
<File Id="TestPs1" Source="Test.ps1" KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
The code and releases are hosted on GitHub - https://github.com/flcdrg/PowerShellWixExtension
Development resources
-
Wix Extension tutorial - http://snhconsultingltd.com/2013/12/14/extending-wix-by-creating-a-custom-wix-extension/
-
Updating the progress bar - http://taocoyote.wordpress.com/2009/05/19/adding-managed-custom-actions-to-the-progressbar/
Categories: PowerShell