Запуск сценария PowerShell из установщика WiX

Я нашел несколько примеров, показывающих, как запустить сценарий PowerShell из WiX, но не удалось запустить ни один из них. Итак, я хотел бы опубликовать то, что у меня есть, с надеждой, что кто-то может указать, что я делаю неправильно.

<!--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)SourcePowerShellShutdownIExplore.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="SOFTWAREMicrosoftPowerShellShellIdsMicrosoft.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>

когда я запускаю созданный установщик, я получаю следующую ошибку (из журнала):

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:WindowsInstallerMSI8228.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.

Я совсем не понимаю, что эта ошибка пытается сказать. Мои внутренние рекомендации плохи? Является ли команда для выполнения сценарий плохой? Что-то еще?

любая помощь наиболее ценится и спасибо заранее.

2 ответов


Похоже, вы запланировали действие CAQuietExec как отложенное. В этом случае необходимо передать командную строку для выполнения через свойство CustomActionData с именем QtExecDeferred, которое записывается в сценарий выполнения. Отложенное действие может получить доступ к свойству из сценария.

больше деталей на http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html


Я не понял ответ Стивена, однако в конечном итоге я получил его работу с помощью этого блога в должности.

вот краткое изложение изменений, которые я внес в код Грега, чтобы заставить его работать:

  • сменил CAQuietExec to WixQuietExec (Я не уверен, если это было необходимо).

  • на SetProperty Я изменил значение С InstallFiles до Id пользовательского действия; в случае Грега это будет RunPowerShellScript.

  • хотя это не связано с вопросом, мне пришлось изменить -Version powershell для 3.0 С 2.0 чтобы не допустить ошибку при запуске моего скрипта.

вот мой фактический рабочий код:

<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\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>