Posted on:
Categories: PowerShell;SharePoint
Description: Remotely provisioning a list from CustomSchemaXml is easy once you know how to structure the XML.
This PowerShell script will provi​sion a new list remotely using ListCreationInformation.CustomSchemaXml.Further below is an example of the XML to be fed in, which is the tricky part.​param(​ [Parameter(Mandatory = $true)][string]$webUrl, [Parameter(Mandatory = $true)][string]$schemaXmlFilePath, [Parameter(Mandatory = $true)][int]$listTemplateId ) $csom = [Reflection.Assembly]LoadWithPartialName('Microsoft.SharePoint.Client') $ctx = New-Object Microsoft.SharePoint.Client.ClientContext $webUrl $ctx.Load($ctx.Web.Lists) $ctx.Load($ctx.Web.ListTemplates) $ctx.ExecuteQuery() $schemaXml = [xml] (Get-Content $schemaXmlFilePath) $template = $ctx.Web.ListTemplates | WHERE $_.ListTemplateTypeKind -eq $listTemplateId $info = New-Object Microsoft.SharePoint.Client.ListCreationInformation $info.Title = $schemaXml.List.Title $info.Url = $schemaXml.List.Url $info.CustomSchemaXml = $schemaXml.OuterXml $info.TemplateType = $listTemplateId $info.TemplateFeatureId = $template.FeatureId $list = $ctx.Web.Lists.Add($info) $ctx.ExecuteQuery()​ This script works against SharePoint 2010 and SharePoint 2013, but requires PowerShell v3 or higher.​How to structure the XML Simply grabbing the SchemaXml from an existing list does not work. An easy way to start is to use Visual Studio. Add a list to a SharePoint project and then grab the Schema.xml file. It can be used as-is. Here is an example generated when choosing the Custom List template.<?xml version="1.0" encoding="utf-8"?> <List xmlnsows="Microsoft SharePoint" Title="List1" FolderCreation="FALSE" Direction="$ResourcesDirection;" Url="Lists/List1" BaseType="0" xmlns="http//schemas.microsoft.com/sharepoint/"> <MetaData> <ContentTypes> <ContentTypeRef ID="0x01"> <Folder TargetName="Item" /> </ContentTypeRef> <ContentTypeRef ID="0x0120" /> </ContentTypes> <Fields> <Field ID="fa564e0f-0c70-4ab9-b863-0177e6ddd247" Type="Text" Name="Title" DisplayName="$Resourcescore,Title;" Required="TRUE" SourceID="http//schemas.microsoft.com/sharepoint/v3" StaticName="Title" MaxLength="255" /> </Fields> <Views> <View BaseViewID="0" Type="HTML" MobileView="TRUE" TabularView="FALSE"> <Toolbar Type="Standard" /> <XslLink Default="TRUE">main.xsl</XslLink> <RowLimit Paged="TRUE">30</RowLimit> <ViewFields> <FieldRef Name="LinkTitleNoMenu"></FieldRef> </ViewFields> <Query> <OrderBy> <FieldRef Name="Modified" Ascending="FALSE"></FieldRef> </OrderBy> </Query> <ParameterBindings> <ParameterBinding Name="AddNewAnnouncement" Location="Resource(wss,addnewitem)" /> <ParameterBinding Name="NoAnnouncements" Location="Resource(wss,noXinviewofY_LIST)" /> <ParameterBinding Name="NoAnnouncementsHowTo" Location="Resource(wss,noXinviewofY_ONET_HOME)" /> </ParameterBindings> </View> <View BaseViewID="1" Type="HTML" WebPartZoneID="Main" DisplayName="$Resourcescore,objectiv_schema_mwsidcamlidC24;" DefaultView="TRUE" MobileView="TRUE" MobileDefaultView="TRUE" SetupPath="pages\viewpage.aspx" ImageUrl="/_layouts/15/images/generic.png?rev=23" Url="AllItems.aspx"> <Toolbar Type="Standard" /> <XslLink Default="TRUE">main.xsl</XslLink> <JSLink>clienttemplates.js</JSLink> <RowLimit Paged="TRUE">30</RowLimit> <ViewFields> <FieldRef Name="LinkTitle"></FieldRef> </ViewFields> <Query> <OrderBy> <FieldRef Name="ID"></FieldRef> </OrderBy> </Query> <ParameterBindings> <ParameterBinding Name="NoAnnouncements" Location="Resource(wss,noXinviewofY_LIST)" /> <ParameterBinding Name="NoAnnouncementsHowTo" Location="Resource(wss,noXinviewofY_DEFAULT)" /> </ParameterBindings> </View> </Views> <Forms> <Form Type="DisplayForm" Url="DispForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> <Form Type="EditForm" Url="EditForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> <Form Type="NewForm" Url="NewForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> </Forms> </MetaData> </List>