Wix Toolset执行Powershell脚本不起作用

时间:2016-11-16 12:00:31

标签: powershell wix msiexec

我想在使用msi文件安装之前和之后运行PowerShell脚本。您可以在下面看到我在Visual Studio 2013中为wix-project配置的基本内容。 msi编译时没有错误,我可以运行msi文件并完成步骤直到安装结束而没有错误。

在日志中我可以看到,CustomAction已经启动,但这不可能是因为尚未创建应该由底层脚本创建的目录。

如果我通过powershell手动运行脚本文件,一切运行良好。所以脚本本身应该工作,不会抛出错误。

这里有什么建议吗?

维克斯-项目:          

  <Product Id="*" Name="MyAPP" Language="1031" Version="1.0.0.0" Manufacturer="Me" UpgradeCode="2A0A9FDB-9DD2-4058-8742-885EF63BFF37">
    <!-- 6e8e53ce-66e4-4d97-900c-9678b83e44cc"> -->
    <Package InstallerVersion="400" Compressed="yes" InstallScope="perMachine" Languages="1031" Manufacturer="Me" Description="Installiert den MyApp auf ihr System" Comments="NOTHING TO COMMENT"/>
    <MediaTemplate EmbedCab="yes" />

    <!-- Major Upgrade Rule to disallow downgrades -->
    <MajorUpgrade DowngradeErrorMessage="Eine neuere Version vom [ProductName] ist bereits installiert." />

    <!-- ################################### -->
    <!-- Aktionen vor installation ##########-->
    <!-- ################################### -->
    <InstallExecuteSequence>
      <Custom Action="StartBatchFile" After="InstallInitialize"/>
      <Custom Action="EndBatchFile" After="InstallFinalize"/>
    </InstallExecuteSequence>
    <CustomAction Id="StartBatchFile"
              Property="RegisterHttpModulePowerShellProperty"
              Value="&quot;C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe&quot; -Version 2.0 -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -File &quot;./BeforeInstallationScript.ps1&quot; &quot;[DIR_ComponentRef]&quot;"
              Execute="immediate" />
    <CustomAction Id="EndBatchFile"
              Property="RegisterHttpModulePowerShellProperty"
              Value="&quot;C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe&quot; o-Versin 2.0 -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -File &quot;./AfterInstallationScript.ps1&quot; &quot;[DIR_ComponentRef]&quot;"
              Execute="immediate" />

    <WixVariable Id="WixUIBannerBmp" Value="WixUIBannerBmp.bmp" />
    <!--    Background bitmap used on the welcome and completion dialogs    493 × 312 -->
    <WixVariable Id="WixUIDialogBmp" Value="WixUIDialogBmp.bmp" />

    <!-- ################################### -->
    <!-- User-Interface ####################-->
    <!-- ################################### -->
    <Property Id="WIXUI_INSTALLDIR">DIR_ComponentRef</Property>
    <UIRef Id="WixUI_InstallDir" />
    <UIRef Id="WixUI_ErrorProgressText" />

    <!-- ################################### -->
    <!-- Notwendige Abhaengigkeiten ########-->
    <!-- ################################### -->
    <PropertyRef Id="NETFRAMEWORK40FULL"/>
    <Condition Message="Diese Anwendung benoetigt .NET Framework 4.0. Bitte installieren sie zuerst das .NET Framework und starten Sie die Installation erneut.">
      <![CDATA[Installed OR NETFRAMEWORK40FULL]]>
    </Condition>

    <!-- ################################### -->
    <!-- FEATURE-Installation ##############-->
    <!-- ################################### -->
    <Feature Id="FEATURE_MyApp" Title="MyApp" Description="Installiert die Datein des MyApps auf das System" Level="1" AllowAdvertise="no" ConfigurableDirectory="DIR_ComponentRef">
      <ComponentRef Id="[...]"/>
      [...]
    </Feature>
  </Product>

  <Fragment>
    <!-- ################################### -->
    <!-- Ordner-Struktur ################### -->
    <!-- ################################### -->
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
          <Directory Id="DIR_ComponentRef" Name="MyApp">
            <Directory Id="DIR_CONFIGURATION" Name="configuration">
              [...]
            </Directory>
          </Directory>
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    [...]
    <!-- ################################### -->
    <!-- Componenten-Definition ######## -->
    <!-- ################################### -->
    <DirectoryRef Id="DIR_ComponentRef">
      <Component Id="CMP_MyApp.exe">
        <File Id="MyApp.exe" Source="$(var.SourcePath)MyApp.exe" KeyPath="yes" Checksum="yes" />
      </Component>
      [...]
    </DirectoryRef>
    </Fragment>
</Wix>

登入结果:

=== Protokollierung gestartet: 16.11.2016  10:41:12 ===
Aktion 10:41:12: INSTALL. 
[...]
Aktion 10:41:35: StartBatchFile. 
Aktion gestartet um 10:41:35: StartBatchFile.
Aktion beendet um 10:41:35: StartBatchFile. Rückgabewert 1.
[...]
Aktion beendet um 10:41:38: InstallFinalize. Rückgabewert 1.
Aktion 10:41:38: EndBatchFile. 
Aktion gestartet um 10:41:38: EndBatchFile.
Aktion beendet um 10:41:38: EndBatchFile. Rückgabewert 1.
Aktion beendet um 10:41:38: INSTALL. Rückgabewert 1.
[...]

如果您需要进一步的信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

我不确定CustomAction是否可以在本地目录下找到PS1文件。尝试使用以下块调整WIX文件

 <!-- Ensure PowerShell is installed and obtain the PowerShell executable location -->
<Property Id="POWERSHELLEXE" Secure="yes">
  <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>

....

<CustomAction Id="RegisterPowershellCommandStop"
              Property="CallPowerShellCommandStop"
              Value="&quot;[POWERSHELLEXE]&quot; -NoLogo -NonInteractive -InputFormat None -ExecutionPolicy Bypass -NoProfile -File &quot;[INSTALLFOLDER]ServiceStartStop.ps1&quot; &quot;[SERVICENAME]&quot; &quot;stop&quot;"
              Execute="immediate" />

....
<DirectoryRef Id="INSTALLFOLDER">
   <Component Id="CMP_StartStopServicesScript" Guid="*">
      <File Id="FILE_StartStopServicesScript" Source="!(wix.binDirectory)\ServiceStartStop.ps1" KeyPath ="yes" />
   </Component>
... 

在这种情况下,我们会调用PS(&#34;存储&#34;在[POWERSHELLEXE]中启动ServiceStartStop.ps1(位于[INSTALLDIR]下)。

希望有所帮助。