Тихо выполняет сценарий PowerShell из WiX Зависает PowerShell
Примечание: этот вопрос также размещен наСписок рассылки 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 Custom Action Содержание: Попытка 1
Моей первой попыткой было использовать специальный символ & для выполнения скрипта.
<CustomAction Id="RegisterHttpModulePSCmd"
Property="RegisterHttpModulePowerShellProperty"
Value=""C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" &'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=""C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -File "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>
Кажется, что оба подхода работают, так как они вносят изменения в нужный файл 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?