A WWF lehetővé teszi, hogy munkafolyamatokat hajtsunk végre erre felkészített alkalmazásokban (host processzekben). Jelen esetben ez az alkalmazás a PowerShell. Jól szemlélteti a résztvevő komponenseket az alábbi ábra:
146
. ábra A workflow elhelyezkedése
(forrás: https://msdn.microsoft.com/en-us/library/vstudio/aa349006(v=vs.90).aspx)
A workflow-kban nem parancsokat, hanem tevékenységeket (activity) hajtunk végre. A tevékenységek eredményét a workflow elmentheti, így a folyamat megszakadása esetén, ha azt újraindítjuk, akkor folytatható a folyamat a megszakadási ponttól. Mi határozhatjuk meg, hogy mikor iktatunk be olyan ellenőrzési pontokat (checkpoint), amelyekhez újraindítás esetén szeretnénk visszatérni. Kérhetjük azt is, hogy minden tevékenység után a WWF automatikusan készítsen ellenőrzési pontot, illetve bizonyos tevékenységek esetében a workflow maga illeszt be ilyen ellenőrzési pontot, mint például a gép újraindításakor.
A tevékenységeket végezhetjük sorban és párhuzamosan is. A soros végrehajtás teljesen hasonló a függvényeknél látott végrehajtási módhoz. A párhuzamos végrehajtás natívan nem érhető el a PowerShell függvényekben, csak ha héttérbeli folyamatokat (job) készítünk, vagy Runspace objektumokkal mi magunk valósítjuk meg a többszálú működést.
A workflow-kban tehát tevékenységeket hajtunk végre, még akkor is, ha látszólag PowerShell cmdleteket írunk. Ezeknek a tevékenységeknek két csoportja van, de sajnos ez nem látszik kívülről, és elég nehéz kideríteni, hogy egy adott sor melyik csoportba is tartozik. Az egyik csoportba az „igazi” workflow tevékenységek tartoznak. Ez azt jelenti, hogy PowerShell alkotói létrehozták a cmdletnek megfelelő natív workflow tevékenységet. Ilyen például a Get-WmiObject, vagy a Get-Service. Az alap PowerShell modulok elég sok cmdletje tartozik ebben acsportba, de nem mindegyik.
A másik csoportba tartozik az összes többi cmdlet és kifejezés. Ilyenkor egy speciális, „Jolly Joker” tevékenység fut le, ami valójában a PowerShell egy példányát hívja meg és átadja ennek a kifejezést. Ezt explitit módon mi magunk is meg tudjuk tenni ha a kifejezésünket beágyazzuk egy inlinescript blokkba, de natív tevékenységek nélküli cmdleteknél és egyéb kifejezéseknél maga a parancsértelmező implit módon is így tesz.
Nézzük tehát az elméleti háttér után a gyakorlatot!