2011-11-07 1 views
2

사용자 지정 C# cmdlet에 새로운 RunSpace를 만들지 않는 것이 좋지 않은가 (또는 특별한 이유가 있습니까?)? 예를 들어 아래와 같이 사용자 지정 Cmdlet을 보유하고 있으며 기존 cmdlet을 호출해야하며이 작업을 수행하는 데 스레딩이나 기타 문제가 있는지 궁금합니다.커스텀 C# cmdlet을 사용하여 새로운 RunSpace를 만드는 것은 나쁜 습관입니까?

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에 대한 특정 콘텐츠 데이터베이스를 지정하려고합니다. SPContentDatabase를 매개 변수로 사용하는 SPSitesCollection.Add()에 대한 오버로드가 있지만 이는 내부 메서드입니다. RunSpace를 만들어 New-SPSite cmdlet (새 콘텐츠 db 지정 가능)을 호출 할 수있게하고 특정 콘텐츠 데이터베이스로 사이트를 만들 수있게하려고합니다.

http://msdn.microsoft.com/en-us/library/ms714873(v=VS.85).aspx은 cmdlet에서 cmdlet을 호출 할 수 있음을 나타내지 만 New-SPSite (실제 클래스 SPCmdletNewSite)도 내부적이므로 직접 호출 할 수 없다는 것을 나타냅니다.

+0

당신이 추가 실행 영역이 필요한 이유는 명확하지 않다. 현재로드 된 스냅인에서 현재 스냅 샷을 제거하지 않으려면 그 이유가 무엇입니까? 실제 코드 또는 의사 코드입니까? 후자의 경우 어떤 부분이 의사입니까? 특히 SPSitesCollection.Add()는 언급되었지만 코드에서 사용되지 않습니다 (미안하지만 방금 놓친 경우). –

+0

제목에 질문에 답하면 (관심있는 실제 질문이 확실하지 않습니다.) 새로운 실행 영역을 만드는 이유가 있다면 나쁜 습관이라고 생각하지 않습니다. 이유가 없다면 그것은 나쁜 습관 일뿐 아니라 새로운 작업 공간은 저렴하지 않습니다. –

+0

감사의 말 로마 - 실제 클래스 구현 (C#에서)이 내부 밀폐 된 New-SPSite cmdlet을 호출하려고합니다. "내부 밀폐 클래스 SPCmdletNewSite : SPNewCmdletBase "입니다. cmdlet 클래스에서 Invoke를 직접 호출 할 수 없기 때문에 위에서 설명한대로 별도의 RunSpace에서 cmdlet을 호출하여 실행할 수 있거나 작성중인 문제를 찾으려고합니다. 다른 대안이 있다면 알려주십시오. C#에서 새로운 사용자 지정 cmdlet을 만드는 것에 비교적 익숙합니다. –

답변

2

cmdlet에서 다른 cmdlet을 호출하려는 경우 일반적으로 중첩 파이프 ()를 새 실행 영역으로 사용하지 않는 것이 좋습니다. 이를 통해 cmdlet의 범위를 사용하여 동일한 변수와 컨텍스트에 액세스 할 수 있습니다. 새로운 실행 영역은 완전히 격리되어 있으며 결과적으로 중량이 더 깁니다. 그러나 호출 범위를 폴링하지 않으려는 경우 바람직 할 수 있습니다. 아마도 중첩 된 파이프 라인을 원한다면 공유 지점 스냅인을 새로 고침 할 필요가 없습니다. 새 공유 지점 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

+0

굉장! 정보를 제공해 주시고 링크를 통해 자신을 더욱 교육 시키십시오. –

관련 문제