I’ll put it simply:
This is a PowerShell script that you can use to change a content type of a library or list to another one. This script can identify between Document Sets and library or list items.
param ( [string]$WebsiteUrl = "http://portal.spdev.com/", [string]$OldCTName = "DSTestCT", [string]$NewCTName = "DSTestCT" ) if ( (Get-PSSnapin -Name MicroSoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null ) { Add-PsSnapin MicroSoft.SharePoint.PowerShell } function Reset-ListContentType ($WebUrl, $ListName, $OldCTName, $NewCTName) { $web = $null try { $web = Get-SPWeb $WebUrl $list = $web.Lists.TryGetList($ListName) $oldCT = $list.ContentTypes[$OldCTName] $isChildOfCT = $list.ContentTypes.BestMatch($rootNewCT.ID).IsChildOf($rootNewCT.ID); if($oldCT -ne $null -and $isChildOfCT -eq $false) { $hasOldCT = $true $isFoldersCTReseted = Reset-SPFolderContentType –web $web -list $list –OldCTName $OldCTName –NewCTName $NewCTName Reset-SPFileContentType –web $web -list $list –OldCTName $OldCTName –NewCTName $NewCTName Remove-ListContentType –web $web -list $list –OldCTName $OldCTName –NewCTName $NewCTName if($hasOldCT -eq $true) { Add-ListContentType –web $web -list $list –OldCTName $OldCTName –NewCTName $NewCTName if($isFoldersCTReseted -eq $true) { Set-SPFolderContentType –web $web -list $list –OldCTName $OldCTName –NewCTName $NewCTName } } } }catch { } finally { if($web) { $web.Dispose() } } } function Remove-ListContentType ($web, $list, $OldCTName, $NewCTName) { $oldCT = $list.ContentTypes[$OldCTName] $isChildOfCT = $list.ContentTypes.BestMatch($oldCT.ID).IsChildOf($oldCT.ID); if($isChildOfCT -eq $true) { $list.ContentTypes.Delete($oldCT.ID) } $web.Dispose() return $isChildOfCT } function Add-ListContentType ($web, $list, $OldCTName, $NewCTName) { $list.ContentTypes.Add($rootNewCT) $web.Dispose() } function Reset-SPFolderContentType ($web, $list, $OldCTName, $NewCTName) { #Get web, list and content type objects $isFoldersCTReseted = $false $isChildOfCT = $list.ContentTypes.BestMatch($rootNewCT.ID).IsChildOf($rootNewCT.ID); $oldCT = $list.ContentTypes[$OldCTName] $folderCT = $list.ContentTypes["Folder"] $newCT = $rootNewCT $newCTID = $newCT.ID #Check if the values specified for the content types actually exist on the list if (($oldCT -ne $null) -and ($newCT -ne $null)) { $list.Folders | ForEach-Object { if ($_.ContentType.ID.IsChildOf($rootNewCT.ID) -eq $false -and $_.ContentType.ID.IsChildOf($oldCT.ID) -eq $true -and $_.Folder.ProgID -eq "Sharepoint.DocumentSet") { Write-Host "Found a document set: " $_.Name "Processing document set" $item = $list.GetItemById($_.ID); $item["ContentTypeId"] = $folderCT.Id $item.Update() $isFoldersCTReseted = $true } } } $web.Dispose() return $isFoldersCTReseted } function Set-SPFolderContentType ($web, $list, $OldCTName, $NewCTName) { #Get web, list and content type objects $folderCT = $list.ContentTypes["Folder"] $newCT = $list.ContentTypes[$NewCTName] #Check if the values specified for the content types actually exist on the list if (($newCT -ne $null)) { $list.Folders | ForEach-Object { if ($_.ContentType.ID.IsChildOf($newCT.ID) -eq $false -and $_.ContentType.ID.IsChildOf($folderCT.ID) -eq $true -and $_.Folder.ProgID -eq "Sharepoint.DocumentSet") { $item = $list.GetItemById($_.ID); $item["ContentTypeId"] = $newCT.Id $item.Update() } } } $web.Dispose() } function Reset-SPFileContentType ($web, $list, $OldCTName, $NewCTName) { #Get web, list and content type objects $isChildOfCT = $list.ContentTypes.BestMatch($rootNewCT.ID).IsChildOf($rootNewCT.ID); $oldCT = $list.ContentTypes[$OldCTName] $folderCT = $list.ContentTypes["Folder"] $newCT = $rootNewCT $newCTID = $newCT.ID #Check if the values specified for the content types actually exist on the list if (($oldCT -ne $null) -and ($newCT -ne $null)) { $list.Folders | ForEach-Object { if ($_.ContentType.ID.IsChildOf($rootNewCT.ID) -eq $false -and $_.ContentType.ID.IsChildOf($oldCT.ID) -eq $true) { $_["ContentTypeId"] = $folderCT.Id $_.Update() } } #Go through each item in the list $list.Items | ForEach-Object { Write-Host "Item present CT ID :" $_.ContentType.ID Write-Host "CT ID To change from :" $oldCT.ID Write-Host "NEW CT ID to change to:" $rootNewCT.ID #Check if the item content type currently equals the old content type specified if ($_.ContentType.ID.IsChildOf($rootNewCT.ID) -eq $false -and $_.ContentType.ID.IsChildOf($oldCT.ID) -eq $true) { #Check the check out status of the file if ($_.File.CheckOutType -eq "None") { Change the content type association for the item $item = $list.GetItemById($_.ID); $item.File.CheckOut() write-host "Resetting content type for file: " $_.Name "from: " $oldCT.Name "to: " $newCT.Name $item["ContentTypeId"] = $newCTID $item.UpdateOverwriteVersion() Write-Host "Item changed CT ID :" $item.ContentType.ID $item.File.CheckIn("Content type changed to " + $newCT.Name, 1) } else { write-host "File" $_.Name "is checked out to" $_.File.CheckedOutByUser.ToString() "and cannot be modified" } } else { write-host "File" $_.Name "is associated with the content type" $_.ContentType.Name "and shall not be modified" } } } else { write-host "One of the content types specified has not been attached to the list"$list.Title return } $web.Dispose() } $web = Get-SPWeb $WebsiteUrl $rootWeb = $web.Site.RootWeb; $rootNewCT = $rootWeb.AvailableContentTypes[$NewCTName] Foreach ($list in $web.Lists) { Write-Host $list.BaseType if($list.Hidden -eq $false -and $list.BaseType -eq "DocumentLibrary") { Write-Host "Processing list: " $list.Title Reset-ListContentType –WebUrl $WebsiteUrl –ListName $list.Title –OldCTName $OldCTName –NewCTName $NewCTName } } $web.Dispose()