Run PowerShell script from WiX installer

I found several examples showing how to run a PowerShell script from WiX, but none of them could be launched. So, I would like to publish what I have, with the hope that someone can indicate what I am doing wrong.

<!--Install the PowerShell script--> <DirectoryRef Id="INSTALLFOLDER"> <Component Id="cmp_ShutdownIExplore" Guid="{4AFAACBC-97BB-416f-9946-68E2A795EA20}" KeyPath="yes"> <File Id="ShutdownIExplore" Name="ShutdownIExplore.ps1" Source="$(var.ProjectDir)Source\PowerShell\ShutdownIExplore.ps1" Vital="yes" /> </Component> </DirectoryRef> <!--Define the CustomAction for running the PowerShell script--> <CustomAction Id="RunPowerShellScript" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="yes" /> <InstallExecuteSequence> <!--Invoke PowerShell script --> <Custom Action="RunPowerShellScript" After="InstallFiles"><![CDATA[NOT Installed]]></Custom> </InstallExecuteSequence> <!-- Define custom action to run a PowerShell script--> <Fragment> <!-- 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> <!-- Define the PowerShell command invocation --> <SetProperty Id="RunPowerShellScript" Before ="InstallFiles" Sequence="execute" Value ="&quot;[POWERSHELLEXE]&quot; -Version 2.0 -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command &quot;&amp; '[#ShutdownIExplore.ps1]' ; exit $$($Error.Count)&quot;" /> </Fragment> 

When I run the installer that I created, I get the following error (from the log):

 MSI (s) (DC:F8) [11:21:46:424]: Executing op: ActionStart(Name=RunPowerShellScript,,) Action 11:21:46: RunPowerShellScript. MSI (s) (DC:F8) [11:21:46:425]: Executing op: CustomActionSchedule(Action=RunPowerShellScript,ActionType=1025,Source=BinaryData,Target=CAQuietExec,) MSI (s) (DC:9C) [11:21:46:459]: Invoking remote custom action. DLL: C:\Windows\Installer\MSI8228.tmp, Entrypoint: CAQuietExec CAQuietExec: Error 0x80070057: failed to get command line data CAQuietExec: Error 0x80070057: failed to get Command Line CustomAction RunPowerShellScript returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox) Action ended 11:21:46: InstallFinalize. Return value 3. 

I do not quite understand what this error is trying to say. Are my internal recommendations bad? Is the command to execute the script bad? Something else?

Any help is greatly appreciated and thanks in advance.

+6
source share
2 answers

Looks like you planned CAQuietExec as pending. In this case, you need to pass the command line, which will be executed through the CustomActionData property called QtExecDeferred, which is written to the script. The pending action can then access the property from the script.

More details at http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html

+4
source

I didn’t understand Stephen’s answer, however I ended up getting a job using this post blog.

Here is a summary of the change I made for Greg's code to make it work:

  • I changed CAQuietExec to WixQuietExec (I'm not sure if this was necessary).

  • In SetProperty I changed the value of the Before attribute from InstallFiles to the user action Id ; in the case of Greg, it will be RunPowerShellScript .

  • Although I am not related to the issue, I had to change -Version powershell to 3.0 from 2.0 to prevent an error when running my script.

Here is my actual working code:

 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> <Product Id="*" Name="..." Language="1033" Version="..." Manufacturer="..." UpgradeCode="..."> <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> <SetProperty Id="InstallMongoDB" Before ="InstallMongoDB" Sequence="execute" Value="&quot;[POWERSHELLEXE]&quot; -Version 3.0 -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command &quot;&amp; '[#MONGODB_INSTALL.PS1]' ; exit $$($Error.Count)&quot;" /> <CustomAction Id="InstallMongoDB" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="deferred" Return="check" Impersonate="yes" /> <InstallExecuteSequence> <Custom Action="InstallMongoDB" Before="InstallFinalize"><![CDATA[NOT Installed]]></Custom> </InstallExecuteSequence> <Component Id="MONGODB_INSTALL.PS1" Guid="..." DiskId="1"> <File Id="MONGODB_INSTALL.PS1" Name="mongodb-install.ps1" Source="mongodb-install.ps1"/> </Component> </Product> <Fragment> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="APPLICATIONFOLDER" Name="..."> <Directory Id="InstallScripts" Name="InstallScripts"> <Component Id="MONGODB_INSTALL.PS1" Guid="..." DiskId="1"> <File Id="MONGODB_INSTALL.PS1" Name="mongodb-install.ps1" Source="mongodb-install.ps1"/> </Component> </Directory> </Directory> </Directory> </Directory> </Fragment> </Wix> 
+1
source

All Articles