This page contains a library of useful PowerShell scripts that aren’t found on other sites or blogs –
The script compiles a report of workflow-related events in a single view for all item versions.
$item = $SitecoreContextItem $db = $SitecoreContextItem.Database $workflowProvider = $db.WorkflowProvider $events =@() $scEvents=@() $versions = $item.Versions.GetVersions() | Sort-Object Version -Descending foreach($version in $versions) { $scEvents = $workflowProvider.HistoryStore.GetHistory($version) foreach($scEvent in $scEvents){ $event = @{ Icon = $scEvent.__Icon User = $scEvent.User Date = $scEvent.Date OldState = if([string]::IsNullOrEmpty($scEvent.OldState)) {"-"}else{ (Get-Item -Path $scEvent.OldState).DisplayName } NewState = if([string]::IsNullOrEmpty($scEvent.NewState)) {"-"}else{ (Get-Item -Path $scEvent.NewState).DisplayName } Version = $version.Version.Number Comment = $scEvent.CommentFields["Comments"] } $events +=$event } } $props = @{ InfoTitle = "Workflow History" InfoDescription = "Displays workflow history for a selected item." PageSize = 25 } $events | Show-ListView @props -Property @{Label="Date"; Expression={$_.Date} }, @{Label="Icon"; Expression={$_.Icon} }, @{Label="User"; Expression={$_.User} }, @{Label="Old State"; Expression={ $_.OldState } }, @{Label="New State"; Expression={ $_.NewState } }, @{Label="Version"; Expression={$_.Version} }, @{Label="Comment"; Expression={$_.Comment} }
The following scripts can be helpful for large content teams working on dedicated areas of content. Using the SPE these scripts can be either placed in the context menu, or in the ribbon of the Content Editor. The item locking and unlocking features prompt users if they would like to have the action applied to the item’s children, if they exist.
The locking script is sophisticated enough to respect existing locks by other users and only locks items that do not already have a lock on them. At the same time the locking feature also respects versions already participating in a content promotion workflow, thus, if the latest version is in a state other than the initial one, a new version is created and locked to the user.
if($SitecoreContextItem -ne $null){ $selectedItems = @(); $selectedItems += $SitecoreContextItem if($SitecoreContextItem.Children.Length -gt 0){ $includeChildrenPromptResult = Show-ModalDialog -Control "ConfirmChoice" -Parameters @{btn_0="Yes"; btn_1="No"; te="Lock child items?"; cp="Lock Item"} -Height 120 -Width 450 if($includeChildrenPromptResult -eq "btn_0"){ $allUnlockedChildItems = Get-ChildItem -Path $SitecoreContextItem.Paths.FullPath -Recurse | where { -not $_.Locking.IsLocked()} $selectedItems += $allUnlockedChildItems } } foreach($item in $selectedItems){ $currentStateName = if(!$item.Fields["__Workflow state"].Value) {""}else{ (Get-Item -Path $item.Fields["__Workflow state"].Value).DisplayName } if($currentStateName -and $currentStateName -ne "Draft"){ $newVersion = Add-ItemVersion -Id $item.ID -IgnoredFields "__Workflow state" $item = $newVersion } $result = $item.Locking.Lock() if($result -eq $false){ Write-Host "Unable to lock " $item.Paths.FullPath". Likely caused by an existing lock or lack of write access." } } }
The unlocking feature only unlocks items that are locked to the acting user.
if($SitecoreContextItem -ne $null){ $selectedItems = @(); if($SitecoreContextItem.Locking.IsLocked()){ $selectedItems += $SitecoreContextItem } if($SitecoreContextItem.Children.Length -gt 0){ $includeChildrenPromptResult = Show-ModalDialog -Control "ConfirmChoice" -Parameters @{btn_0="Yes"; btn_1="No"; te="Unlock child items?"; cp="Unlock Item"} -Height 120 -Width 450 if($includeChildrenPromptResult -eq "btn_0"){ $allLockedChildItems = Get-ChildItem -Path $SitecoreContextItem.Paths.FullPath -Recurse | where { $_.Locking.IsLocked()} $selectedItems += $allLockedChildItems } } foreach($item in $selectedItems){ $itemLockingProvider = New-Object -TypeName Sitecore.Data.Locking.ItemLocking -ArgumentList $item $owner = $itemLockingProvider.GetOwner() $user = (Get-User -Current).Name if($owner -ne $user){ Write-Host "Unable to unlock " $item.Paths.FullPath". $owner already has a lock on the item." continue } $result = $item.Locking.Unlock() if($result -eq $false){ Write-Host "Unable to unlock " $item.Paths.FullPath". Likely caused by lack of write access." } } }
The script can be used by a workflow step to allow removal of a version in the workflow. This functionality is useful in cleaning up the Draft state of the workflow.
if($SitecoreContextItem -ne $null){ New-UsingBlock(New-Object Sitecore.SecurityModel.SecurityDisabler){ $itemVersionCount= $SitecoreContextItem.Versions.Count if($itemVersionCount -gt 1){ Remove-ItemVersion -Item $SitecoreContextItem -Version $SitecoreContextItem.Version }else{ # Removing item if it only has one version; the removed items can be restored from the recycle bin. #Remove-Item -Path $SitecoreContextItem.Paths.FullPath } } Close-Window }