Passaggio all'ora legale 26 marzo 2017 02:0003:00 sposta avanti l'orologio (si dorme un ora in meno)
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).
# 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)"
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:
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:
# 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."
L'ideale è schedulare il tutto alla notte per avere una fotografia, giornaliera, di controllo dello stato dei workflow.