В некоторых случаях требуется выгрузить и загрузить рабочий процесс Sharepoint 2013.
Это может потребоваться если нужно создать копию рабочего процесса для дальнейшей доработки.
Встроенных средств, осуществить это, найдено не было, но был найден скрипт для импорта и экспорта рабочих процессов.
Выгрузка рабочего процесса – ExtractWorkflowXaml.
param( [string]$url, [string]$wf_displayname, [string]$workflow_xaml_path ) <#*****Readme****# $url - URL узла, ассоциированный с сервисом Workflow, на котором развернут рабочий процесс; $wf_displayname - имя рабочего процесса; $workflow_xaml_path - путь к файлу для сохранения. #****************#> if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null) { Add-PSSnapin "Microsoft.SharePoint.PowerShell" Write-Host "Added Snapin for SharePoint" -ForegroundColor Yellow } $w = Get-SPWeb $url -ErrorAction SilentlyContinue if ($w -eq $null){ Write-Host "Get web for" $url "failed" -ForegroundColor Red return } Write-Host "Get web for" $url -ForegroundColor Green $wfm = New-Object Microsoft.SharePoint.WorkflowServices.WorkflowServicesManager($w) -ErrorAction SilentlyContinue Write-Host "Workflow Service Manager was found:" ($wfm -ne $null) -ForegroundColor @("Red", "Green")[$wfm -ne $null] if ($wfm -eq $null) { return } $wfd = $wfm.GetWorkflowDeploymentService() Write-Host "Workflow Deployment service discovered:" ($wfd -ne $null) -ForegroundColor @("Red", "Green")[$wfd -ne $null] if ($wfd -eq $null) { return } $wf_def = $wfd.EnumerateDefinitions($false) | Where-Object { $_.DisplayName -eq $wf_displayname } | Select-Object -First 1 Write-Host "Workflow definition was found:" ($wf_def -ne $null) -ForegroundColor @("Red", "Green")[$wf_def -ne $null] if ($wf_def -ne $null){ try { $wf_def.Xaml | Out-File $workflow_xaml_path -ErrorVariable ProcessError } catch{ } Write-Host "Export workflow.xaml has been" @("failed", "successfully completed")[$ProcessError.Count -eq 0] -ForegroundColor @("Red", "Green")[$ProcessError.Count -eq 0] }
Запуск ExtractWorkflowXaml.ps1 <URL сайта> <Имя рабочего процесса> <путь куда выгружать файл>
ExtractWorkflowXaml.ps1 “http://mysp.com/” “Test workflow” “C:\WF\workflow.xaml”
Загрузка рабочего процесса – DeployListWorkflow
param( [string]$workflow_xaml, [string]$url, [string]$list_name, [string]$wf_displayname, [string]$overwrite ) <#*****Readme****# $workflow_xaml - путь к файлу; $url - URL узла, ассоциированный с сервисом Workflow, на которой необходимо развернуть рабочий процесс; $list_name - имя списка, с которым должен быть ассоциирован рабочий процесс; $wf_displayname - имя рабочего процесса; $overwrite - признак необходимости перезаписи рабочего процесса, если он уже существует. #****************#> if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null) { Add-PSSnapin "Microsoft.SharePoint.PowerShell" Write-Host "Added Snapin for SharePoint" -ForegroundColor Yellow } $w = Get-SPWeb $url Write-Host "Get web for" $url -ForegroundColor Green $wfm = New-Object Microsoft.SharePoint.WorkflowServices.WorkflowServicesManager($w) Write-Host "Workflow Service Manager was found:" ($wfm -ne $null) -ForegroundColor @("Red", "Green")[$wfm -ne $null] $wfd = $wfm.GetWorkflowDeploymentService() Write-Host "Workflow Deployment service discovered:" ($wfd -ne $null) -ForegroundColor @("Red", "Green")[$wfd -ne $null] #Check if workflow exists $publishedWorkflows = $wfd.EnumerateDefinitions($false) $wfdef = $publishedWorkflows | Where-Object {$_.DisplayName -eq $wf_displayname} | Select-Object -First 1 $wf_exists = $wfdef -ne $null if ($wf_exists -and -not $overwrite){ Write-Host "This workflow already exists. Please set other workflow name or set `$overwrite = `$true." -ForegroundColor Red } else { # Publishing workflow if ($wfdef -eq $null){ $wfdef = New-Object Microsoft.SharePoint.WorkflowServices.WorkflowDefinition } else { Write-Host "Workflow definition will be overwritten." -ForegroundColor Yellow } $wf_targetlist = $w.Lists[$list_name] $wfdef.DisplayName = $wf_displayname $wfdef.Xaml = Get-Content $workflow_xaml -Encoding UTF8 $wfdef.Properties["Overriide"] = $true # additional properties for view binding list in SPD # if ($wf_targetlist -ne $null){ $wfdef.SetProperty("RestrictToType", "List") $wfdef.SetProperty("RestrictToScope", $wf_targetlist.ID.ToString().ToUpper()) } #***********************# $wf_id = $wfd.SaveDefinition($wfdef) Write-Host "Workflow definition id:" $wf_id $wfd.PublishDefinition($wf_id) # Binding to list if ($wf_targetlist -eq $null){ Write-Host ("List <{0}> not found. Binding failed." -f $list_name) -ForegroundColor Red } else { $wfs = $wfm.GetWorkflowSubscriptionService() Write-Host "Workflow Subscription service discovered:" ($wfs -ne $null) -ForegroundColor @("Red", "Green")[$wfs -ne $null] $wf_subs = $wfs.EnumerateSubscriptions() | Where-Object {$_.DefinitionId -eq $wf_id -and $_.EventSourceId -eq $wf_targetlist.ID} # Delete previous subscriptions $wf_subs | ForEach-Object {$wfs.DeleteSubscription($_.Id)} $wf_tasklist = $w.Lists | Where-Object {$_.Title -eq "Задачи рабочего процесса"} | Select-Object -First 1 Write-Host "Workflow task list found:" ($wf_tasklist -ne $null) -ForegroundColor @("Red", "Green")[$wf_tasklist -ne $null] $wf_histlist = $w.Lists | Where-Object {$_.Title -eq "Журнал рабочего процесса"} | Select-Object -First 1 Write-Host "Workflow history list found:" ($wf_histlist -ne $null) -ForegroundColor @("Red", "Green")[$wf_histlist -ne $null] $wfsub = New-Object Microsoft.SharePoint.WorkflowServices.WorkflowSubscription $wfsub.DefinitionId = $wf_id $wfsub.Name = $wf_displayname $wfsub.Enabled = $true $eventTypes = New-Object System.Collections.Generic.List[String] $eventTypes.Add("WorkflowStart") $wfsub.EventTypes = $eventTypes $wfsub.EventSourceId = $wf_targetlist.ID.ToString() $wfsub.SetProperty("TaskListId", $wf_tasklist.ID.ToString()) $wfsub.SetProperty("HistoryListId", $wf_histlist.ID.ToString()) $wfsub.SetProperty("ListId", $wf_targetlist.ID.ToString()) $wfsub.SetProperty("Microsoft.SharePoint.ActivationProperties.ListId", $wf_targetlist.ID.ToString()) # additional properties # $wfsub.SetProperty("SharePointWorkflowContext.ActivationProperties.SiteId", $w.Site.ID.ToString()) $wfsub.SetProperty("SharePointWorkflowContext.ActivationProperties.WebId", $w.ID.ToString()) #***********************# $wfsub_id = $wfs.PublishSubscriptionForList($wfsub, $wf_targetlist.ID) Write-Host "Workflow subscription id:" $wfsub_id } Write-Host "Finished." -ForegroundColor Green }
Запуск DeployListWorkflow.ps1 <Путь к файлу рабочего процесса .xaml> <URL сайта> <Имя списка> <Имя рабочего процесса> <Перезаписывать?>
DeployListWorkflow.ps1 “C:\WF\workflow.xaml” “http://mysp.com/” “Test Workflow List” “My New Workflow” $true