在WiX安装中调用C#自定义操作的PowerShell命令

问题描述:

背景:我正在为SharePoint组件编写安装。除了将软件放到目标机器上之外,我想正确配置它。 SharePoint(尤其是2010)通过PowerShell公开其管理功能。所以我写了一个C#自定义操作调用一系列命令,就像这样:在WiX安装中调用C#自定义操作的PowerShell命令

Runspace runSpace = RunspaceFactory.CreateRunspace(); 
runSpace.Open(); 
Pipeline pipeline = runSpace.CreatePipeline(); 

Command addSnapin = new Command("Add-PSSnapin"); 
addSnapin.Parameters.Add("Name", "Microsoft.SharePoint.Powershell"); 
pipeline.Commands.Add(addSnapin); 
pipeline.Invoke(); 

Command getSearchApp = new Command("Get-SPEnterpriseSearchServiceApplication"); 
pipeline = runSpace.CreatePipeline(); 
pipeline.Commands.Add(getSearchApp); 

Object searchApp = pipeline.Invoke().First().BaseObject; 
/* pass searchApp to other PS cmdlets */ 

问题: 当我运行从测试可执行的代码,它工作正常。但是,从自定义操作运行时,它不起作用。它失败了,并且日志包含消息“Get-SPEnterpriseSearchServiceApplication”未被识别为cmdlet的名称......“。这个cmdlet应该是由Add-PSSnapin命令导入的(据我所知,该命令已成功)。

问题: 为什么PS找不到功能,当相同的命令序列工作在PS主机在我的测试程序运行时? 有没有更简单的方法去做这个过程?对于复杂的PS自定义操作,WiX似乎没有太多的支持(不是我的复杂,但它不是一个单行)。

+1

执行Add-PSSnapin命令后,请检查Pipeline.Error属性以查看添加是否失败以及原因。 – 2010-08-14 00:06:01

+0

好的,错误集合包含“没有为Windows PowerShell版本2注册管理单元”。在完成一些搜索之后,我意识到我的自定义操作是在32位进程中运行的,可能无法加载SP管理Cmdlet。谢谢你的提示。 – bmm6o 2010-08-16 17:03:39

在这种特殊情况下,Snapin无法加载,因为自定义操作是作为32位进程运行的。我改变了构建设置,将其编译为x64并开始工作。 Keith的建议很有帮助(+1) - 我认为失败会导致抛出异常,但事实并非如此。