Молчаливое выполнение сценария PowerShell из WiX зависает PowerShell

Примечание: этот вопрос также размещен на список рассылки пользователей WiX.

Я пытаюсь молча выполнить сценарий 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:Windowssystem32WindowsPowerShellv1.0powershell.exe&quot; &amp;'C:Program Files (x86)My CompanyScriptsregister-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:Windowssystem32WindowsPowerShellv1.0powershell.exe&quot; -NoLogo -NonInteractive -NoProfile -File &quot;C:Program Files (x86)My CompanyScriptsregister-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>

оба подхода, похоже, работают, поскольку они внесите изменения в нужную сеть.файл конфигурации, однако, оба подхода зависают 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 ответов


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


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

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

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

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