当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] SharePoint Online:使用 PowerShell 更改列表项的内容类型

作者:精品下载站 日期:2024-12-14 14:52:53 浏览:16 分类:玩电脑

SharePoint Online:使用 PowerShell 更改列表项的内容类型


要求:更改 SharePoint Online 列表中所有项目的内容类型。

如何更改 SharePoint Online 中现有项目的内容类型?

在 SharePoint Online 中,内容类型用于定义列表和库中项目的元数据和行为。有时,您可能需要更改列表或库中现有项目的内容类型,以改进它们并遵守业务要求。本指南将向您展示如何使用 Web 浏览器界面轻松进行切换,我将向您展示如何使用 PowerShell 更改内容类型!

您可以通过编辑特定项目并切换“内容类型”字段来更改现有列表项目的内容类型。

[玩转系统] SharePoint Online:使用 PowerShell 更改列表项的内容类型

好吧,让我们使用 PowerShell 批量更改 SharePoint Online 中的内容类型。

在更改列表项的内容类型之前,您必须先将内容类型添加到列表中:如何使用 PowerShell 将内容类型添加到 SharePoint Online 中的列表?

使用 PowerShell 更改 SharePoint Online 中的内容类型:

让我们将所有列表项的内容类型“Crescent Project V1”更改为“Crescent Project V2”(无论哪个项目使用内容类型“Crescent Project V1”)。


#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

#Function to Change the Content Type of All Items in SharePoint Online list using powershell
Function Change-SPOContentType
{
    param
    (
        [string]$SiteURL  = $(throw "Enter the Site URL!"),
        [string]$ListName = $(throw "Enter the List Name!"),
        [string]$OldContentTypeName = $(throw "Enter the Old Content Type Name!"),
        [string]$NewContentTypeName = $(throw "Enter the New Content Type Name!")
    )
    Try {
        #Get Credentials to connect
        $Cred= Get-Credential
 
        #Setup the context
        $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
        $Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)

        #Get the Web
        $Web = $Ctx.Web
        $Ctx.Load($Web)
        $Ctx.ExecuteQuery()
        
        #Get the List & and content types
        $List = $Web.lists.GetByTitle($ListName)
        $ContentTypes = $List.ContentTypes
        $Ctx.Load($List)
        $Ctx.Load($ContentTypes)
        $Ctx.ExecuteQuery()

        #Get the content type to Update
        $OldContentType = $ContentTypes | Where {$_.Name -eq $OldContentTypeName}
        $NewContentType = $ContentTypes | Where {$_.Name -eq $NewContentTypeName}

        If($NewContentType -eq $Null)
        {
            Write-Host "Content Type '$NewContentTypeName' doesn't Exist in the list. Add the Content Type to the List First!" -ForegroundColor Yellow
            Return
        }

        #Define Query to get List Items in batch
        $Query = New-Object Microsoft.SharePoint.Client.CamlQuery
        $Query.ViewXml = "@
        <View Scope='RecursiveAll'>
            <Query>
                <OrderBy><FieldRef Name='ID' Ascending='TRUE'/></OrderBy>
            </Query>
            <RowLimit Paged='TRUE'>$BatchSize</RowLimit>
        </View>
        @"

        $Counter = 1
        $BatchCounter = 0
        #Get List Items in Batch
        Do
        {
            $ListItems = $List.GetItems($Query)
            $Ctx.Load($ListItems)
            $Ctx.ExecuteQuery()
            $Query.ListItemCollectionPosition = $ListItems.ListItemCollectionPosition
            $Ctx.ExecuteQuery()
            $BatchCounter += $ListItems.Count

            #Get All List Items with Old Content Type
            $ItemsToUpdate = $ListItems | Where {$_["ContentTypeId"].StringValue -eq ($OldContentType.ID)}
            Write-host "Number of Items Found with Old Content Type in the Batch ($Counter to $BatchCounter):" $ItemsToUpdate.count
            $Counter = $BatchCounter

            If($ItemsToUpdate.count -gt 0)
            {
                #Iterate through each item with old content type and update the conent type
                ForEach($Item in $ItemsToUpdate)
                {
                    $Item["ContentTypeId"]  = $NewContentType.Id
                    $Item.Update()
                    Write-host "Content Type Update Quued for List Item ID: $($Item.ID)" -ForegroundColor yellow
                }
                $Ctx.ExecuteQuery()
                write-host "Content Types Updated Successfully!" -ForegroundColor  Green
            }
        }While($Query.ListItemCollectionPosition -ne $null)
    }
    Catch {
        write-host -f Red "Error Changing Content Type!" $_.Exception.Message
    }
}

#Variables
#Set Variables
$SiteURL = "https://crescent.sharepoint.com/sites/pmo"
$ListName ="Projects"
$OldContentTypeName= "Crescent Project V1"
$NewContentTypeName= "Crescent Project V2"
$BatchSize = 500

#Call the function to Change the content type
Change-SPOContentType -SiteURL $SiteURL -ListName $ListName -OldContentTypeName $OldContentTypeName -NewContentTypeName $NewContentTypeName 

此 PowerShell 以编程方式更改 SharePoint Online 列表中所有项目的内容类型。如果您需要更改 SharePoint 网站中已有文件的内容类型,这会很有用。

SharePoint Online:使用 PnP PowerShell 更改内容类型

以下是如何使用 PnP PowerShell 模块的 Set-PnPListItem cmdlet 更改 SharePoint Online 中的内容类型:


#Set Variables
$SiteURL = "https://crescent.sharepoint.com/sites/projects"
$ListName = "Project Proposal"
$OldContentTypeName = "Crescent Proposal V1"
$NewContentTypeName = "Crescent Project Proposal V2"

#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Interactive

#Get the New Content Type from the List
$NewContentType = Get-PnPContentType -List $ListName | Where {$_.Name -eq $NewContentTypeName}

#Get List Items of Old content Type
$ListItems = Get-PnPListItem -List $ListName -Query "<View><Query><Where><Eq><FieldRef Name='ContentType'/><Value Type='Computed'>$OldContentTypeName</Value></Eq></Where></Query></View>"
Write-host "Total Number of Items with Old Content Type:"$ListItems.count

ForEach($Item in $ListItems)
{
    #Change the Content Type of the List Item
    Set-PnPListItem -List $ListName -Identity $Item -ContentType $NewContentType
}

虽然上述脚本对于项目数少于 5000 的列表和库来说工作得非常好,但当与 Get-PnPListItem cmdlet 的“Query”参数结合使用时,“PageSize”参数没有任何效果,并获取“Get-PnPListItem:禁止尝试的操作”因为它超出了列表视图阈值。”错误。因此,这是处理更大列表的 PowerShell 脚本:

让我向您展示如何使用 PnP PowerShell 更改 SharePoint Online 中列表项的内容类型:


#Set Variables
$SiteURL = "https://crescent.sharepoint.com/sites/projects"
$ListName = "Project Proposal"
$OldContentTypeName = "Crescent Proposal V1"
$NewContentTypeName = "Crescent Project Proposal V2"

#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Interactive
$List =  Get-PnPList -Identity $ListName

#Get the Old and New Content Types from the List
$OldContentType = Get-PnPContentType -List $ListName | Where {$_.Name -eq $OldContentTypeName}
$NewContentType = Get-PnPContentType -List $ListName | Where {$_.Name -eq $NewContentTypeName}

#Get List Items of old content type from the list
$global:counter = 0;
$ListItems = Get-PnPListItem -List $List -PageSize 500 -Fields ContentTypeId -ScriptBlock { Param($items) $global:counter += $items.Count; Write-Progress -PercentComplete `
              ($global:Counter / ($List.ItemCount) * 100) -Activity "Getting Items from List" -Status "Checking Items $global:Counter to $($List.ItemCount)"} | Where {$_.FieldValues.ContentTypeId.ToString() -eq $OldContentType.StringId}

Write-host "Total Number of Items with Old Content Type Found:"$ListItems.count
#Loop through List Items
ForEach($Item in $ListItems)
{
    #Change the Content Type of the List Item
    Set-PnPListItem -List $ListName -Identity $Item -ContentType $NewContentType | Out-Null
    Write-host "Content Type Updated for List Item ID $($Item.ID)!" -f Green
}

执行此脚本后,列表中的所有项目都会将其内容类型更新为新的内容类型。通过执行这些简单的步骤,您可以轻松更新列表和库中项目的内容类型,从而提高您的 SharePoint 管理技能并简化您的工作流程。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯