2016-11-16 7 views
0

Я хочу запустить PowerShell-Script до и после установки с помощью msi-файла. Ниже вы можете увидеть основное содержимое моей конфигурации в Visual Studio 2013 для wix-проекта. Msi скомпилирован без ошибок, и я могу запустить msi-файл и пройти все этапы до конца установки без ошибок.Wix Toolset выполнение Powershell-script не работает

В журнале я вижу, что CustomAction был запущен, но это не может быть правдой, потому что каталог, который должен был быть создан базовым сценарием, не был создан.

Если я запускаю скрипт-файл вручную с помощью powershell, все работает хорошо. Поэтому сам сценарий должен работать и не выдает ошибки.

Какие-либо предложения, что здесь не так?

Wix-проекта:

<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. 
[...] 

Позвольте мне знать, если вам нужна дополнительная информация.

ответ

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 ("хранится" в [POWERSHELLEXE] начать ServiceStartStop.ps1 (расположенный под [INSTALLDIR]).

Надежда, что помогает.

+0

Это значит, что мне нужно скопировать ps-скрипты в ту же папку, что и файл msi, и не может подключить его непосредственно в msi-файл в качестве ресурса? –

+0

Нет, вам не нужно копировать файлы ps1 отдельно цель. Скрипты ps1 являются «внутри» пакета MSI, будут установлены на целевом объекте и затем вызваны через th e 'CustomAction'. – Moerwald

+0

Я борюсь с этим. Файлы сценариев будут скопированы правильно в нужное место в локальной системе. Но может быть слишком поздно, потому что мне нужны эти файлы, прежде чем я удалю старые установленные файлы в системе. Во всяком случае, я все еще не вижу, что скрипт выполнен. Почему я это вижу? во второй раз, когда я запускаю установщик, файлы из предыдущей установки-исполнения все еще существуют, и скрипт не создает каталог, как я ожидаю, созданный скриптом. –