首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自定义C# cmdlet创建新的RunSpace是不是一种坏做法?

使用自定义C# cmdlet创建新的RunSpace是不是一种坏做法?
EN

Stack Overflow用户
提问于 2011-11-07 23:59:56
回答 1查看 1.6K关注 0票数 2

在自定义c# cmdlet中创建新的RunSpace是否被认为是坏做法(或者是否有特定的理由不这样做)?例如,我有一个自定义的Cmdlet,如下所示,需要调用现有的cmdlet,我想知道这样做是否会有线程或其他问题。

代码语言:javascript
复制
 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)也是内部的,不能直接调用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-08 20:57:29

如果要在cmdlet中调用另一个cmdlet,通常做法是使用嵌套管道,而不是新的运行空间。这使您可以使用cmdlet的作用域,从而可以访问相同的变量和上下文。一个新的运行空间是完全隔离的,其结果是更重量级的,但如果你不想污染调用作用域,可能需要它。我认为您可能需要一个嵌套的管道,这样就不必重新加载sharepoint管理单元(我假设在调用新的sharepoint cmdlet时它已经加载了)。

可以从cmdlet中使用此方法。这是一个嵌套管道,因为您的命令已经在管道中运行。

代码语言:javascript
复制
var pipe = Runspace.DefaultRunspace.CreateNestedPipeline(...);
pipe.Invoke()

http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.runspace.createnestedpipeline(v=VS.85).aspx

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8038992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档