Find item duplicates with Sitecore PowerShell

Should I say anything? The code explains itself 😊

$sourceItems = Get-ChildItem -Recurse -Path "/sitecore/content/"
$query = "/sitecore/content//*[@@id!='{0}' and @OldUrl='{1}']"
$queryWithContains = "/sitecore/content//*[@@id!='{0}' and (@OldUrl='{1}' or contains(@OldUrl, '{2}'))]"
$foundDuplicatesCollection = New-Object System.Collections.ArrayList
Write-Host "SourceItemParentPath, SourceItemPath, SourceItemId, FoundDuplicateParentPath, FoundDuplicatePath, FoundDuplicateId, OriginalUrl, FoundDuplicateUrl" -ForegroundColor Green
foreach ($sourceItem in $sourceItems) {
$originalUrl = $sourceItem["OldUrl"]
if ($originalUrl -eq "") {
#Write-Host "Without original url - " $sourceItem.Paths.FullPath -ForegroundColor Magenta
continue
}
$builtQuery = ""
# change this condition if you need a different or remove it completely
# this condition checks links like old-domain.org?id=123456789
if ($originalUrl -like '*?id=*') {
$uri = New-Object -TypeName System.Uri -ArgumentList $originalUrl
$id = [System.Web.HttpUtility]::ParseQueryString($uri.Query)["id"]
$builtQuery = [string]::Format($queryWithContains, $sourceItem.ID, $originalUrl, "?id=" + $id)
}
else {
$builtQuery = [string]::Format($query, $sourceItem.ID, $originalUrl)
}
#Write-Host $builtQuery
$foundDuplicates = Get-Item -Path "master:" -Query $builtQuery
foreach ($foundDuplicate in $foundDuplicates) {
$reverseResults = $foundDuplicatesCollection | Where-Object { $_.SourceItemId -eq $foundDuplicate.ID -and $_.FoundDuplicateId -eq $sourceItem.ID }
if ($reverseResults.Count -gt 0) {
continue
}
$result = New-Object System.Object
$result | Add-Member -MemberType NoteProperty -Name "SourceItemParentPath" -Value $sourceItem.Parent.Paths.FullPath
$result | Add-Member -MemberType NoteProperty -Name "SourceItemPath" -Value $sourceItem.Paths.FullPath
$result | Add-Member -MemberType NoteProperty -Name "SourceItemId" -Value $sourceItem.ID
$result | Add-Member -MemberType NoteProperty -Name "FoundDuplicateParentPath" -Value $foundDuplicate.Parent.Paths.FullPath
$result | Add-Member -MemberType NoteProperty -Name "FoundDuplicatePath" -Value $foundDuplicate.Paths.FullPath
$result | Add-Member -MemberType NoteProperty -Name "FoundDuplicateId" -Value $foundDuplicate.ID
$result | Add-Member -MemberType NoteProperty -Name "OriginalUrl" -Value $originalUrl
$result | Add-Member -MemberType NoteProperty -Name "FoundDuplicateUrl" -Value $foundDuplicate["OldUrl"]
$foundDuplicatesCollection.Add($result) | Out-Null
Write-Host $result.SourceItemParentPath"," -ForegroundColor DarkYellow -NoNewline
Write-Host $result.SourceItemPath"," -ForegroundColor DarkYellow -NoNewline
Write-Host $result.SourceItemId"," -ForegroundColor DarkYellow -NoNewline
Write-Host $result.FoundDuplicateParentPath"," -ForegroundColor Cyan -NoNewline
Write-Host $result.FoundDuplicatePath"," -ForegroundColor Cyan -NoNewline
Write-Host $result.FoundDuplicateId"," -ForegroundColor Cyan -NoNewline
Write-Host $result.OriginalUrl"," -ForegroundColor DarkYellow -NoNewline
Write-Host $result.FoundDuplicateUrl -ForegroundColor Cyan
}
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s