从 WiX 静默执行 PowerShell 脚本挂起 PowerShell [英] Silently executing a PowerShell script from WiX Hangs PowerShell

查看:212
本文介绍了从 WiX 静默执行 PowerShell 脚本挂起 PowerShell的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

注意:这个问题也发布在 WiX 用户邮件列表.

我正在尝试从 WiX 生成的 MSI 中静默执行 PowerShell 脚本.但是,无论何时我运行安装程序 PowerShell 都会挂起.有趣的是,根据安装程序日志,PowerShell 脚本似乎运行成功.此外,如果我通过任务管理器终止 PowerShell 进程,安装程序将取消安装并回滚所有更改.

I am trying to silently execute a PowerShell script from a WiX produced MSI. However, anytime I run the installer PowerShell hangs. Interestingly enough, according to the installer logs the PowerShell script appears to run successfully. Additionally, if I kill the PowerShell process via Task Manager, the installer cancels the installation and rolls back any changes.

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

我在这方面的第一次尝试是使用 &执行脚本的特殊字符.

My first attempt at this was to use the & special character to execute the script.

<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 参数来执行脚本.

My second attempt was to use the -File argument to execute the script.

<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,从而挂起安装程序.

Both approaches seem to work as they make modifications to the desired web.config file, however, both approaches hang PowerShell and thus the installer.

我修改了 PowerShell 脚本以打印版本信息而不执行任何其他操作.MSI 日志文件随后会显示以下内容:

I modified the PowerShell script to print out the version information and not perform any other actions. The MSI log files then display the following:

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 时,接下来的几条日志消息是:

It is at this point that the installer appears to have stopped as PowerShell does not exit. When I kill PowerShell manually with Task Manager the next few log messages are:

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 脚本?

How do I silently execute a PowerShell script from Wix without hanging PowerShell?

推荐答案

我在搜索一个不相关的问题时看到了几个类似的帖子,并找到了一个 答案.底线:在命令行中包含标志 -InputFormat None.

I saw several posts like this one while searching on an unrelated issue and found an answer. Bottom line: include the flag -InputFormat None in your command line.

这篇关于从 WiX 静默执行 PowerShell 脚本挂起 PowerShell的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆