A PowerShell 3.0 verziótól új lehetőség jelent meg szkriptek futtatására: a workflow (munkafolyamat). A workflow nagyon hasonlít a függvényhez, első nekifutásra úgy is gondolhatunk rá, mint egy olyan függvényre, aminél a function kulcsszó helyett a workflow kulcsszót használjuk:
workflow Hello {
param([string] $nev)
$c = Get-WmiObject -Class Win32_computersystem
"Helló $nev! Üdvözlet a $($c.name) gépről."
}
A workflow is egy névből, opcionálisan paraméterekből és végrehajtható szkriptblokkból áll. Itt csak egy szkriptblokkot lehet használni, azaz nincs Begin, Process és End rész, viszont lehet Parallel és Sequence blokkunk.
Ha ezt a fenti Hello workflow-t futtatjuk, akkor ugyanazt kapjuk, mintha függvény lenne:
PS C:\> hello -nev Tibor
Helló Tibor! Üdvözlet a STLENO gépről.
Mi mégis a nagy különbség? Nézzük meg egy kicsit részletesebben ezt a Hello workflow-t a Get‑Command segítségével:
PS C:\> Get-Command hello | format-list *
HelpUri :
Definition :
param([string] $nev)
$c = Get-WmiObject -Class Win32_computersystem
"Helló $nev! Üdvözlet a $($c.name) géprol."
XamlDefinition : <Activity
x:Class="Microsoft.PowerShell.DynamicActivities.Act
ivity_1923589599"
xmlns="http://schemas.microsoft.com/netfx/2009/xaml
/activities"
xmlns:sad="clr-namespace:System.Activities.Debugger
;assembly=System.Activities"
…
ScriptBlock :
[CmdletBinding()]
param (
[string]
[string] $nev,
[hashtable[]] $PSParameterCollectio
n,
[string[]] $PSComputerName,
[ValidateNotNullOrEmpty()] $PSCrede
ntial,
[uint32] $PSConnectionRetryCount,
[uint32] $PSConnectionRetryInterval
Sec,
[ValidateRange(1, 2147483)][uint32]
$PSRunningTimeoutSec,
[ValidateRange(1, 2147483)][uint32]
$PSElapsedTimeoutSec,
[bool] $PSPersist,
[ValidateNotNullOrEmpty()] [System.
Management.Automation.Runspaces.AuthenticationMechanism
] $PSAuthentication,
…
$job = [Microsoft.PowerShell.Comman
ds.ImportWorkflowCommand]::StartWorkflowApplication(
$PSCmdlet,
$jobName,
'a39c9958-2b15-
4c11-864d-683e72674505',
$AsJob,
$parameterColle
ctionProcessed,
$finalParameter
Collection,
$debuggerActive
)
…
Nem is másolom ide a teljes kimenetet, mert annyira hosszú, csak néhány kiragadott részt, de már ebben látszik egy furcsa tulajdonság, a XamlDefinition. Annak ellenére, hogy PowerShellben vagyunk, valójában ez az XML rész hajtódik végre a Windows Workflow Foundationben található workflow motor segítségével. Azaz fontos megjegyezni, hogy workflow-k esetében PowerShell szintaxissal valójában workflow-t írunk, így egy kicsit ezzel a technológiával is meg kell ismerkedjünk hamarosan.
Amit még láthatunk, hogy a ScriptBlock tulajdonságban egy komoly szkript van, az általunk definiálton kívül számos további paraméterrel, amelyek lehetővé teszik, hogy automatikusan rendelkezzen számos olyan speciális lehetőséggel, amit nem nekünk kell leprogramozni, hanem gyárilag tudja a workflow. Ez a bonyolult szkript fogja valójában megszólítani a Windows Workflow Foundationt és a StartWokflowApplication metódus hívásával átadja neki a XAML workflow definíciót. Nézzük, mi van a hátterében!