Вопрос

Примечание: этот вопрос также опубликован в Список рассылки пользователей Wix.

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

PowerShell Script Содержимое

# @param website The website under which the module should be compiled and registered.
# @param name The name of the module to be registered.
# @param assembly The assembly name, version, culture and public key token to be compiled.
# @param assemblyType The fully qualified assemebly type to be registered.

param([string]$website = "website", [string]$name = "name", [string]$assembly = "assembly", [string]$assemblyType= "assemblyType")

import-module webadministration
add-webconfiguration /system.web/compilation/assemblies "IIS:\sites\$website" -Value @{assembly="$assembly"}
new-webmanagedmodule -Name "$name" -Type "$assemblyType" -PSPath "IIS:\sites\$website"

Wix Custom Action Содержание: попытка 1

Моя первая попытка этого заключалась в том, чтобы использовать и специальный символ для выполнения скрипта.

<CustomAction Id="RegisterHttpModulePSCmd"
              Property="RegisterHttpModulePowerShellProperty"
              Value="&quot;C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe&quot; &amp;'C:\Program Files (x86)\My Company\Scripts\register-httpmodule.ps1' -website 'Default Web Site' -name 'MyCustomModule' -assembly 'MyCompany.Product.Feature, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx' -assemblyType 'MyCompany.Product.Feature.MyModule'"
              Execute="immediate" />

<CustomAction Id="RegisterHttpModulePowerShellProperty"
              BinaryKey="WixCA" 
              DllEntry="CAQuietExec64" 
              Execute="deferred"
              Return="check" 
              Impersonate="no" />

<InstallExecuteSequence>
   <Custom Action="RegisterHttpModulePSCmd" After="CostFinalize">NOT  Installed</Custom>
   <Custom Action="RegisterHttpModulePowerShellProperty" After="InstallFiles">NOT Installed</Custom>
</InstallExecuteSequence>

Wix Custom Action Содержание: попытка 2

Моя вторая попытка состояла в том, чтобы использовать аргумент -file для выполнения скрипта.

<CustomAction Id="RegisterHttpModulePSCmd"
              Property="RegisterHttpModulePowerShellProperty"       
              Value="&quot;C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe&quot; -NoLogo -NonInteractive -NoProfile -File &quot;C:\Program Files (x86)\My Company\Scripts\register-httpmodule.ps1&quot; -website &quot;Default Web Site&quot; -name &quot;MyCustomModule&quot; -assembly &quot;MyCompany.Product.Feature, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx&quot; -assemblyType &quot;MyCompany.Product.Feature.MyModule&quot;"
              Execute="immediate" />

<CustomAction Id="RegisterHttpModulePowerShellProperty"
              BinaryKey="WixCA" 
              DllEntry="CAQuietExec64" 
              Execute="deferred"
              Return="check" 
              Impersonate="no" />

<InstallExecuteSequence>
   <Custom Action="RegisterHttpModulePSCmd" After="CostFinalize">NOT  Installed</Custom>
   <Custom Action="RegisterHttpModulePowerShellProperty" After="InstallFiles">NOT Installed</Custom>
</InstallExecuteSequence>

Оба подхода, кажется, работают, поскольку они вносят изменения в желаемый файл web.config, однако оба подхода подвесы подвешивают PowerShell и, следовательно, установщик.

Дополнительная информация

Я изменил скрипт PowerShell, чтобы распечатать информацию о версии и не выполнять какие -либо другие действия. Файлы журнала MSI затем отображают следующее:

MSI (s) (D4:78) [10:26:31:436]: Hello, I'm your 32bit Elevated custom action server.
CAQuietExec64:  
CAQuietExec64:  
CAQuietExec64:  Name             : ConsoleHost
CAQuietExec64:  Version          : 2.0
CAQuietExec64:  InstanceId       : 62b0349c-8d16-4bd1-94e5-d1fe54a9ff54
CAQuietExec64:  UI               : System.Management.Automation.Internal.Host.InternalHostUserI
CAQuietExec64:                     nterface
CAQuietExec64:  CurrentCulture   : en-US
CAQuietExec64:  CurrentUICulture : en-US
CAQuietExec64:  PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
CAQuietExec64:  IsRunspacePushed : False
CAQuietExec64:  Runspace         : System.Management.Automation.Runspaces.LocalRunspace

Именно в этот момент установщик, похоже, остановился, поскольку PowerShell не выходит. Когда я убиваю PowerShell вручную с помощью Manager Task Manager, следующие несколько сообщений журнала:

CAQuietExec64:  Error 0x80070001: Command line returned an error.
CAQuietExec64:  Error 0x80070001: CAQuietExec64 Failed CustomAction RegisterHttpModulePowerShellProperty returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox) Action ended 10:27:10: InstallFinalize. Return value 3.

Как молча выполнить сценарий PowerShell от Wix без подвесной пауэршиллеты?

Это было полезно?

Решение

Я видел несколько таких постов, как этот, и в поисках не связанной проблемы и нашел отвечать. Анкет Итог: включите флаг -InputFormat None в вашей командной строке.

Другие советы

Вы пытались добавить ключевое слово exit до конца сценария?

Я наткнулся на аналогичную ситуацию с проектом C#, над которым я работал. После строительства проекта я вызову PowerShell в <AfterBuild> цель с использованием MSBuild <Exec> Задача, указав сценарий для запуска. Если сценарий не включал exit Ключевое слово, VS2010 «висит», то есть оно фактически ждет, пока PowerShell выполнит свою задачу, в то время как PowerShell ожидает ввода пользователя.

Если вы откроете менеджер задач или Sysinternals Процесс исследователя, ты увидишь powershell.exe бегать, как будто ничего не так. Если вы убьете процесс, VS2010 (т.е. msbuild) бросает ошибку.

Таким образом, вам нужно будет сказать PowerShell, что вы сделали с ним, добавив exit к сценарию он работает, и все должно быть хорошо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top