Donnerstag, 16. Juni 2011

Document Sets und PowerShell

Seit SharePoint 201ß erfreut sich jeder SharePoint Administrator über die PowerShell. Viele Verwaltungsaufgaben lassen sich nun durch Skripts automatisieren, aber auch einmalige Konfigurationen und Lösungen lassen sich einrichten. Sehr gerne verwende ich die PowerShell zur Dokumentenmigration aus dem Filesystem oder zur Neustrukturierung. An die Grenzen der vorhanden Cmdlets bin ich bei dem neuen Feature der Dokumentenmappen gestoßen - dafür gibt es nämlich keine! Das Erzeugen oder Ändern von Dokumentenmappen ist durch die mitgelieferten Cmdlets nicht möglich. Daher findet Ihr im folgenden Skript die Möglichkeit, Dokumentenmappen mit der PowerShell über das Objektmodel von SharePoint in der PowerShell anzulegen.

  1. ### Load SharePoint SnapIn   
  2. if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null)   
  3. {   
  4.     Add-PSSnapin Microsoft.SharePoint.PowerShell   
  5. }   
  6. ### Load SharePoint Object Model   
  7. [System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”)   
  8.   
  9. ### Get web and list   
  10. $web = Get-SPWeb http://myweb   
  11. $list = $web.Lists["List with Document Sets"]   
  12.   
  13. ### Get Document Set Content Type from list   
  14. $cType = $list.ContentTypes["Document Set Content Type Name"]   
  15.   
  16. ### Create Document Set Properties Hashtable   
  17. [Hashtable]$docsetProperties = @{"DocumentSetDescription"="A Document Set"}   
  18. $docsetProperties = @{"CustomColumn1"="Value 1"}   
  19. $docsetProperties = @{"CustomColum2"="Value2"}   
  20.     ### Add all your Columns for your Document Set   
  21.   
  22. ### Create new Document Set   
  23. $newDocumentSet = [Microsoft.Office.DocumentManagement.DocumentSets.DocumentSet]::Create($list.RootFolder,"Document Set Title",$cType.Id,$docsetProperties)   
  24. $web.Dispose()  
Die Spaltenwerte der Dokumentenmappe werden durch die ab Zeile 16 erstellte Hashtable angelegt. Dabei werden die internen Spaltennamen angegeben. Wichtig ist auch, dass man den Inhaltstyp ( Content Type ) $cType aus der Sammlung der Liste auswählt und nicht aus der Sammlung des Webs. Ansonsten wird anstatt einer Dokumentenmappe nur ein neuer Ordner erstellt.
Als weite Methoden unter [Microsoft.Office.DocumentManagement.DocumentSets.DocumentSet] steht noch folgendes zur Verfügung:
Document Set Methoden

Mehr Details zu den Methoden findet man auch in der MSDN hier . Mit diesem Handwerkszeug sollte nichts mehr zwischen der PowerShell und Dokumentenmappen stehen!

Good Luck,

Andreas

Kommentare:

  1. Thanks, your post is really helpful but I got an error message while I'm creating a document sets in line 23 of your code.

    The command is shown below.
    $newDocumentSet = [Microsoft.Office.DocumentManagement.DocumentSets.Docu
    mentSet]::Create($list.RootFolder,$docsetName,$cType.Id,$docsetProperties)

    The error code is shown below.

    Exception calling "Create" with "4" argument(s): "0x80070005"
    At line:1 char:89
    + $newDocumentSet = [Microsoft.Office.DocumentManagement.DocumentSets.DocumentS
    et]::Create <<<< ($list.RootFolder,$docsetName,$cTypeSharedPractice.Id,$docsetP
    roperties)
    + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

    Do you have any suggestion? Thank you in advance.

    AntwortenLöschen
  2. Ponnuki, got that problem also and solved it. Basically, one of your arguments is probably NULL. In my case, it was because I got mixed up between DocLib content type "Document Set" and SPWeb content type "Document set". In the following example, I try to iterate over a list of OrgIds to create a docset for each one. Other difficulty: you need the .ID property of ctype, not the whole object.

    $NewSiteUrl = $WebAppUrl + "sites/" + $OrgId3.ORG_ID_3
    New-SPSite -Url $NewSiteUrl -OwnerAlias $SiteOwner -SecondaryOwnerAlias $InstallAccount -Name $OrgId3.ORG_ID_3 -Template $BlankSiteTemplate
    $NewSite = Get-SPWeb $NewSiteUrl

    # Activate Document Set Feature
    Enable-SPFeature -Identity DocumentSet -Url $NewSiteUrl

    $ListTempl = GetListTemplate $NewSite
    #Write-Host $ListTempl.Name
    $NewSite.Lists.Add($DocumentLibraryName, $DocumentLibraryDescription,$ListTempl)

    # Enable Content Types on DocLib
    $DocLib = $NewSite.Lists[$DocumentLibraryName]
    $DocLib.ContentTypesEnabled = $true

    # Add SPWeb "Document Set" ContentType to DocLib
    $DocLib.ContentTypes.Add($NewSite.ContentTypes[$DocumentSet])
    $DocLib.Update()

    # Find out List "Document Set" ContentType
    $cType = $DocLib.ContentTypes[$DocumentSet]

    # Get Opp_IDs for this ORG_ID_3
    $OppIdsOrgL3s = $OppData | select OPP_ID, ORG_ID_3 | WHERE {$_.ORG_ID_3 -eq $OrgId3.ORG_ID_3} | SELECT OPP_ID | Sort-Object -Property OPP_ID -Unique
    foreach ($OppIdsOrgL3 in $OppIdsOrgL3s)
    {
    CreateDocumentSets $DocLib $OppIdsOrgL3.OPP_ID $cType.Id
    }
    $NewSite.Dispose()
    }


    ... and the function
    function CreateDocumentSets($docLib, $oppId, $cType)
    {
    ### Create new Document Set
    [Hashtable]$docsetProperties = @{}
    $newDocumentSet = [Microsoft.Office.DocumentManagement.DocumentSets.DocumentSet]::Create($docLib.RootFolder, $oppId, $cType, $docsetProperties)
    }

    AntwortenLöschen
  3. Hi
    I have a document set with managed metadata property. How will you set the value for Managed Metadata field using powershell?

    AntwortenLöschen