注意:此问题也发布在WiX Users mailing list。
上我试图从WiX生成的MSI静默执行PowerShell脚本。但是,无论何时我运行安装程序,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=""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自定义操作内容:尝试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脚本?
答案 0 :(得分:20)
我在搜索一个不相关的问题时看到了几个这样的帖子,发现了answer。底线:在命令行中包含标志-InputFormat None
。
答案 1 :(得分:0)
您是否尝试将关键字exit
添加到脚本的末尾?
我遇到过与我一直在研究的C#项目类似的情况。构建项目之后,我使用MSBuild的<AfterBuild>
任务在<Exec>
目标中调用PowerShell,指定要运行的脚本。如果脚本没有包含exit
关键字,VS2010会“挂起” - 也就是说它实际上正在等待PowerShell完成其任务,而PowerShell会等待用户输入。
如果您打开任务管理器或SysInternals Process Explorer,您会看到powershell.exe
正在运行,好像没有错。如果你终止进程,VS2010(即MSBuild)会抛出错误。
因此,您需要通过向运行的脚本添加exit
来告诉PowerShell您已完成此操作,并且所有内容都应该很好。