Тихо выполняет сценарий PowerShell из WiX Зависает PowerShell - PullRequest
11 голосов
/ 09 ноября 2010

Примечание. Этот вопрос также размещен в списке рассылки WiX Users .

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

Содержимое скрипта PowerShell

# @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 Содержание: Попытка 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 Содержание: Попытка 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 с помощью диспетчера задач, появляются следующие сообщения журнала:

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 без вывода сообщений, не вешая PowerShell?

Ответы [ 2 ]

20 голосов
/ 03 июня 2011

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

0 голосов
/ 16 ноября 2010

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

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

Если вы откроете диспетчер задач или SysInternals Process Explorer , вы увидите, что powershell.exe работает, как будто ничего не случилось. Если вы завершите процесс, VS2010 (т.е. MSBuild) выдаст ошибку.

Таким образом, вам нужно будет сообщить PowerShell, что вы сделали с ним, добавив exit к скрипту, который он запускает, и все должно быть в порядке.

...