Come elencare tutti workflow definiti in SharePoint tramite PowerShell
Con questo script PowerShell è possibile elencare tutti i workflow associati alle liste SharePoint presenti in una site collection o in tutte le site collection ($siteUrl=$null).
Torna utile per fare un po' di pulizia delle vecchie versioni di workflow create con lo SharePoint Designer e per verificare che non ci siano istanze attive o da molto tempo o in errore (tipicamente quando RunningInstances è molto elevato).
Lo script stampa a video un risultato simile al seguente:
Il risultato può essere scritto su una lista SharePoint per una più semplice consultazione:
L'ideale è schedulare il tutto alla notte per avere una fotografia, giornaliera, di controllo dello stato dei workflow.
PowerShell
# http://www.sgart.it
# legge tutti i workflow creati in SharePoint
$siteUrl = "http://portal.sgart.local" # site collection da cui leggere
$onlyRunning = $false # se true considera solo i workflow con delle istanze attive
$File = $null #"$pwd\Workflows.txt" # eventuale persorso di scrittura dell'output se diverso da null
#-------------------------------------------------------------------
Add-PSSnapin microsoft.sharepoint.powershell -ErrorAction SilentlyContinue
Write-Host "Read workflow status from $siteUrl"
if($siteUrl -eq $null -or $siteUrl -eq ""){
$sites= Get-SPSite -Limit All
}else{
$sites= Get-SPSite $siteUrl
}
$result=@() # conterrà il risultato dei workflow trovati
foreach ($site in $sites) {
Write-Host "Site: $($site.url)"
foreach ($web in $site.AllWebs) {
Write-Host " Web: $($web.url)"
foreach ($list in $web.Lists) {
Write-Host " List: $($list.Title)" -NoNewline
$wfItems = $list.workflowassociations | where {$onlyRunning -eq $false -or $_.runninginstances -gt 0}
if($wfItems -ne $null){
Write-Host " " -NoNewline
foreach ($wf in $wfItems) {
Write-Host "." -NoNewline
# creo l'oggetto da archiviare in $result
$obj = [PSCustomObject]@{
ListUrl = $web.URL + '/' + $list.RootFolder.Url;
WorkflowName = $wf.Name;
RunningInstances = $wf.runninginstances;
Modified = $wf.Modified;
ID = $wf.ID;
}
$result += $obj
if ($File -ne $null){
Write-Output "$($web.URL + '/' + $list.RootFolder.Url), $($wf.Name), $($wf.runninginstances), $($wf.Modified), $($wf.id)" | Out-File $File -Append
}
}
}
Write-Host ""
}
}
}
$result
Write-Host "Found: $($result.count)"
Lo script stampa a video un risultato simile al seguente:
Text
Name Value
---- -----
WorkflowName WF Corsi
ListUrl http://portal.sgart.local/Lists/Corsi
RunningInstances 0
Modified 02/03/2012 16:59:51
ID 4ed18099-7e85-4098-99cc-0e19ae9ee0aa
WorkflowName Assistenzainviomail (Previous Version:27/04/2015 15.20.13)
ListUrl http://portal.sgart.local/Lists/Assistenza
RunningInstances 0
Modified 27/04/2015 13:20:27
ID 133a491d-c556-4fba-ba6c-03ded8d4df12
...
Found: 76
Il risultato può essere scritto su una lista SharePoint per una più semplice consultazione:
PowerShell
# http://www.sgart.it
# scrivo i workflow trovati su una lista SharePoint
# ogni volta vengono cancellati tutti gli item e inserita la nuova fotografia dello stato
# lista su cui scrivere i risultati deve avere le colonne:
# Title (string), ListUrl (Url), WorkflowName (string), RunningInstances (numeric), WorkflowModified (datetime)
$siteResultUrl = "http://portal.sgart.local/SitoTest"
$listResultUrl = "/Lists/StatoWorkFlow"
#--------------------------------------------------------------
$wResult = Get-SPWeb $siteResultUrl
Write-Host "Write on SharePoint $($wResult.url)"
$lResult = $wResult.GetList($wResult.ServerRelativeUrl + $listResultUrl)
Write-Host " on list $($lResult.Title)"
$itemsResult = $lResult.items;
#cancello gli esistenti
Write-Host "Deleting " -NoNewline
while ($lResult.items.Count -gt 0){
Write-Host "." -NoNewline
$lResult.items[0].Delete()
}
Write-Host ""
#aggiungo i nuovi
Write-Host "Adding " -NoNewline
$result | %{
Write-Host "." -NoNewline
$r = $_
$newItem = $itemsResult.Add()
$newItem["Title"] = $r.Id
$newItem["ListUrl"] = $r.ListUrl
$newItem["WorkflowName"] = $r.WorkflowName
$newItem["RunningInstances"] = $r.RunningInstances
$newItem["WorkflowModified"] = $r.Modified
$newItem.Update()
}
Write-Host ""
Write-Host "End."