在自定义c# cmdlet中创建新的RunSpace是否被认为是坏做法(或者是否有特定的理由不这样做)?例如,我有一个自定义的Cmdlet,如下所示,需要调用现有的cmdlet,我想知道这样做是否会有线程或其他问题。
public class SPCmdletNewBusinessSite : SPNewCmdletBase<SPSite>
{
...
private void ExecuteRunspaceCommand()
{
Runspace runspace = RunspaceFactory.CreateRunspace();
PSSnapInException snapInError;
runspace.RunspaceConfiguration.AddPSSnapIn("Microsoft.SharePoint.PowerShell", out snapInError);
runspace.ThreadOptions = PSThreadOptions.Default;
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
Command newSiteProc = new Command("New-SPSite");
newSiteProc.Parameters.Add(new CommandParameter("Url", "http://goober-dc/9393"));
newSiteProc.Parameters.Add(new CommandParameter("OwnerAlias", "GOOBER\\Administrator"));
newSiteProc.Parameters.Add(new CommandParameter("Template", "STS#1"));
newSiteProc.Parameters.Add(new CommandParameter("Language", "1033"));
newSiteProc.Parameters.Add(new CommandParameter("ContentDatabase", "Site_Specific_ContentDB"));
pipeline.Commands.Add(newSiteProc);
Collection<PSObject> results = new Collection<PSObject>();
results = pipeline.Invoke();
foreach (PSObject obj in results)
{
base.WriteObject(((SPSite)obj.BaseObject).RootWeb.Title);
}
}
}具体地说,我希望创建一个SharePoint 2010 SPSite并为该SPSite指定一个特定的内容数据库。SPSitesCollection.Add()有一个重载,它接受SPContentDatabase作为参数,但这是一个内部方法。我想创建RunSpace,以便能够调用New-SPSite cmdlet (它允许指定新的内容数据库),从而能够创建具有特定内容数据库的站点。
我发现http://msdn.microsoft.com/en-us/library/ms714873(v=VS.85).aspx表明您可以从cmdlet中调用cmdlet,但New-SPSite (实际的类SPCmdletNewSite)也是内部的,不能直接调用。
发布于 2011-11-08 20:57:29
如果要在cmdlet中调用另一个cmdlet,通常做法是使用嵌套管道,而不是新的运行空间。这使您可以使用cmdlet的作用域,从而可以访问相同的变量和上下文。一个新的运行空间是完全隔离的,其结果是更重量级的,但如果你不想污染调用作用域,可能需要它。我认为您可能需要一个嵌套的管道,这样就不必重新加载sharepoint管理单元(我假设在调用新的sharepoint cmdlet时它已经加载了)。
可以从cmdlet中使用此方法。这是一个嵌套管道,因为您的命令已经在管道中运行。
var pipe = Runspace.DefaultRunspace.CreateNestedPipeline(...);
pipe.Invoke()http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.runspace.createnestedpipeline(v=VS.85).aspx
https://stackoverflow.com/questions/8038992
复制相似问题