Share via


Een scriptwerkstroom schrijven

 

Van toepassing op: Windows Server 2012, Windows Server 2012 R2

In de onderwerpen in deze sectie wordt uitgelegd hoe u een werkstroom schrijft in de scripttaal Windows PowerShell®, dezelfde taal die u gebruikt voor het schrijven van functies en scripts in Windows PowerShell. U kunt de werkstromen die u schrijft uitvoeren op de opdrachtregel, ze opnemen in scripts en ze opnemen in scriptmodules.

Zie Writing a Windows PowerShell Workflow (Engelstalig) in de MSDN-bibliotheek voor meer informatie over het schrijven van werkstromen in XAML, de eigen taal van Windows Workflow Foundation.

Een werkstroom plannen

Windows PowerShell Workflow is een krachtige oplossing die telkens wanneer deze wordt uitgevoerd gegevens kan verzamelen van en wijzigingen kan aanbrengen in honderden computers. Plan het werkstroomontwerp voor eenvoud en efficiëntie. Houd er rekening mee dat de werkstroom zichzelf kan onderbreken of door gebruikers kan worden onderbroken, dat deze kan worden bestuurd vanuit vele PSSessions die verbinding maken met één server-sideproces, dat deze opnieuw opstarten kan overleven, opdrachten en functies kan omvatten die parallel worden uitgevoerd en dat voor elke opdracht een eigen sessie wordt uitgevoerd.

Gebruik de volgende richtlijnen voor planning

  • Als u nog niet bekend bent met werkstromen, lees dan de referentieonderwerpen in deze sectie, inclusief Syntactische verschillen tussen scriptwerkstromen en scripts.

  • Begin met het inventariseren van de taken die door de werkstroom worden uitgevoerd. Markeer de onderdelen die tegelijkertijd kunnen worden uitgevoerd of niet in een vooraf bepaalde volgorde hoeven te worden uitgevoerd. Markeer hiervan alle onderdelen die in een sequentiële volgorde moet worden uitgevoerd.

  • Neem binnen de werkstroom taken op in functies. Gebruik voor elke taak een bestaande Windows PowerShell-cmdlet of maak een nieuwe opdracht voeg een controlepunt toe na elke kritieke stap.

  • Werkstromen zijn ontworpen om te worden uitgevoerd op meerdere doelcomputers. U hoeft in de werkstroom geen externe sessies te maken of externe opdrachten te gebruiken, zoals opdrachten die gebruikmaken van de cmdlet Invoke-Command.

  • Net als bij elk script dat wordt uitgevoerd op meerdere computers, moet u rekening houden met verschillen tussen de computers die van invloed kunnen zijn op de werking van het script, met inbegrip van verschillende besturingssystemen, apparaten, bestandssysteemorganisatie, omgevingsvariabelen en Windows PowerShell-versies.

  • Plan de Help-onderwerpen voor de werkstroom van tevoren. Houd een record bij van informatie die u moet meedelen aan gebruikers, met inbegrip van een voorkeursarchitectuur voor de werkstroom, voorkeurskenmerken voor sessieconfiguratie en machtigingen.

Schrijf de werkstroom met een scripteditor, zoals Windows PowerShell Integrated Scripting Environment (ISE), waardoor werkstroomsyntaxis wordt afgedwongen en syntaxisfouten worden gemarkeerd. De syntactische verschillen tussen scripts en werkstromen zijn significant, dus een hulpprogramma dat bekend is met zowel werkstromen als scripts bespaart u kostbare tijd bij het programmeren en testen.

Zie 'How Workflows and Windows PowerShell Scripts Differ' in Aan de slag met Windows PowerShell Workflow (Engelstalig) voor meer informatie over taken die geschikt zijn voor werkstromen.

Het sleutelwoord Workflow

Begin met het sleutelwoord workflow, waardoor een werkstroomopdracht herkenbaar wordt voor Windows PowerShell. Het sleutelwoord workflow is vereist in een scriptwerkstroom. Het sleutelwoord workflow wordt gevolgd door de naam van de werkstroom. De inhoud van de werkstroom staat tussen accolades.

Hieronder ziet u het syntaxisschema voor het sleutelwoord Workflow.

workflow Test-Workflow
{
    ...
}

Meer informatie over sleutelwoorden in de scripttaal Windows PowerShell vindt u in about_Language_Keywords.

Naamgeving van werkstromen en werkstroomelementen

Een werkstroom is een opdrachttype in Windows PowerShell. Kies een naam met de indeling werkwoord-zelfstandig naamwoord. Gebruik de Get-Verb-cmdlet en het Help-onderwerp Approved Verbs for Windows PowerShell Commands (Engelstalig) om een goedgekeurde bewerking voor de naam te selecteren.Windows PowerShell genereert een waarschuwing wanneer opdrachten die geen goedgekeurde werkwoorden bevatten, worden geïmporteerd vanuit een module. Gebruik een beschrijvend zelfstandig naamwoord en zo nodig een voorvoegsel voor een zelfstandig naamwoord, om opdrachtnaamconflicten te voorkomen wanneer de werkstroom wordt geïmporteerd in een sessie.

Namen van parameters en variabelen in werkstromen kunnen alleen letters, cijfers, het koppelteken (-) en het onderstrepingsteken (_) bevatten. Vermijd het gebruik van het koppelteken in parameternamen, want elke parameternaam met koppelteken in de werkstroom en in aanroepen van de werkstroom moet tussen accolades worden geplaatst. Gebruik niet de namen van de algemene werkstroomparameters, runtimevariabelen voor werkstromen of andere gereserveerde woorden, zoals 'workflow' en 'parallel'.

Zie voor meer informatie over runtimeparameters voor werkstromen het Help-onderwerp PSWorkflowRuntimeVariable-opsomming (Engelstalig) in de MSDN-bibliotheek.

Zie voor meer informatie over gereserveerde woorden 'Reserved Words in Workflows' in Syntactische verschillen tussen scriptwerkstromen en scripts en about_Reserved_Words (Engelstalig).

Parameters toevoegen aan een werkstroom

Gebruik het sleutelwoord Param met het optionele kenmerk Parameter om parameters toe te voegen aan een werkstroom. Dit zijn dezelfde technieken waarmee u parameters toevoegt aan een functie.

In het volgende codeblok ziet u de syntaxis van het sleutelwoord Param en het kenmerk Parameter in een scriptwerkstroom.

workflow Test-Workflow
{
param ([Type]$<ParameterName>)
}

workflow Test-Workflow
{
    Param
    (
        [Parameter(Mandatory=<$True | $False>)]
        [<Type>]
        $<ParameterName>
    )
}

U kunt het kenmerk CmdletBinding ook gebruiken om de kenmerken ConfirmImpact, DefaultParameterSetName, HelpUri en SupportsShouldProcess op te geven.

In het volgende codeblok ziet u de syntaxis van een voorbeeldwerkstroom die gebruikmaakt van het kenmerk CmdletBinding.

workflow Test-Workflow
{   
    [CmdletBinding(ConfirmImpact=<String>,
        DefaultParameterSetName=<String>,
        HelpURI=<URI>,
        PositionalBinding=<Boolean>)]

    Param
    (
        [parameter(Mandatory=$true)]
        [String[]]
        $<ParameterName>
    )
}

U hoeft geen algemene werkstroomparameters toe te voegen aan de werkstroom.Windows PowerShell Workflow voegt de algemene parameters en algemene parameters voor werkstromen toe aan alle werkstromen, inclusief eenvoudige werkstromen die niet het kenmerk CmdletBinding of Parameter bevatten.

Zie de volgende Help-onderwerpen voor meer informatie over parameters in functies en werkstromen.

Activiteiten toevoegen aan een werkstroom

Een activiteit is de basiseenheid voor werk in een werkstroom. Elke opdracht en expressie die u in een werkstroom gebruikt, wordt uitgevoerd als een activiteit. Een activiteit in Windows PowerShell Workflow lijkt veel op een cmdlet. U voert een activiteit uit door de naam van de activiteit te typen, gevolgd door de parameters.Windows PowerShell Workflow zet veel van de cmdlets uit Windows PowerShell om in activiteiten. Er is slechts een kleine set cmdlets die zijn uitgesloten. Zie 'Excluded Cmdlets' in Activiteiten gebruiken in scriptwerkstromen voor een lijst met uitgesloten cmdlets.

De meeste essentiële cmdlets van Windows PowerShell zijn geïmplementeerd als activiteiten. Als u deze in de werkstroom wilt gebruiken, typt u gewoon de naam of alias van de cmdlet.

De volgende workflow bevat bijvoorbeeld de activiteit Get-Process.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    gps -Name Winword
}

Wanneer een cmdlet geen overeenkomstige activiteit heeft en niet expliciet is uitgesloten, voert Windows PowerShell Workflow de cmdlet automatisch uit in de activiteit inlineScript en wordt de uitvoer geretourneerd naar de werkstroom.

In de volgende werkstroom wordt bijvoorbeeld de Get-WindowsFeature-cmdlet gebruikt, die impliciet wordt uitgevoerd in een inlineScript-activiteit.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
}

U kunt zelfs cmdlets uitvoeren die zijn uitgesloten omdat ze niet zijn geïmplementeerd als activiteit, maar dan moet u ze uitvoeren in een inlineScript-activiteit. In de volgende werkstroom wordt bijvoorbeeld een inlineScript-activiteit gebruikt om de cmdlet Get-Variable uit te voeren, die een uitgesloten cmdlet is.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable -Name PSHome }
}

U kunt ook expressies gebruiken in een werkstroom, met inbegrip van wiskundige expressies en vergelijkingsinstructies.Windows PowerShell Workflow voert expressies automatisch uit in een speciale voor dit doel bestemde activiteit.

De volgende werkstroom bevat bijvoorbeeld een expressie. Net als alle expressies wordt deze uitgevoerd in een activiteit.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable PSHome }

    320GB / 3MB
}

Zie Activiteiten gebruiken in scriptwerkstromen voor meer informatie over activiteiten.

Het gebruik van de parameters van activiteiten

Activiteiten zijn opdrachten die parameters hebben, net als cmdlets. Wanneer een cmdlet wordt omgezet in een activiteit, blijven de syntaxis en parameters hetzelfde. Er zijn enkele uitzonderingen, vermeld in het Help-onderwerp 'Activities in Script Workflows'.

Positionele parameters zijn echter niet geldig in activiteiten, zodat alle parameternamen vereist zijn. Aliassen en afkortingen van parameters zijn toegestaan. In de volgende voorbeeldwerkstroom worden bijvoorbeeld de Name-parameters van de cmdlets Get-Process, Get-WindowsFeature en Get-Variable gebruikt in de opdrachten.

workflow Test-Workflow
{
    Get-Process -Name PowerShell
    Get-WindowsFeature -Name PowerShell, PowerShell-v2
    InlineScript { Get-Variable -Name PSHome }
}

Dynamische parameters zijn ook niet geldig in activiteiten. Als u een dynamische parameter wilt aanroepen, neemt u de opdracht op in een InlineScript-activiteit. De volgende werkstroom bevat bijvoorbeeld een inlineScript-activiteit die de dynamische parameter CodeSigningCert van de cmdlet Get-ChildItem gebruikt. De parameter CodeSigningCert wordt toegevoegd door de certificaatprovider en werkt alleen in het Cert:-station.

workflow Test-Workflow
{
   InlineScript {Get-ChildItem -Path Cert:\CurrentUser -CodeSigningCert}
} 

Zie Windows PowerShell-opdrachten uitvoeren in een werkstroom voor meer informatie over de inlineScript-activiteit.

Het gebruik van algemene activiteitsparameters

Windows PowerShell Workflow voegt een set algemene activiteitsparameters toe aan activiteiten. Met deze parameters kunt u opties instellen die essentieel zijn in een omgeving met meerdere computers.

Sommige algemene werkstroomparameters zijn ook algemene activiteitsparameters. Met deze functie kunt u activiteitspecifieke uitzonderingen maken voor de waarden van de algemene werkstroomparameters. U kunt bijvoorbeeld de parameter PSComputerName gebruiken om een activiteit alleen uit te voeren op geselecteerde computers, of de parameter PSCredential voor het uitvoeren van een activiteit met alternatieve referenties.

De algemene activiteitsparameters zijn geldig voor de meeste, maar niet voor alle activiteiten. De algemene activiteitsparameters zijn bijvoorbeeld niet geldig voor de activiteiten Suspend-Workflow en Checkpoint-Workflow. De algemene activiteitsparameters zijn ook niet beschikbaar voor cmdlets of expressies die automatisch door Windows PowerShell Workflow worden uitgevoerd in een activiteit. De algemene activiteitsparameters zijn beschikbaar voor de InlineScript-activiteit, maar niet voor opdrachten in het InlineScript-scriptblok.

De activiteiten in de volgende werkstroom gebruiken de algemene activiteitsparameters wanneer ze geldig zijn.

workflow Test-Workflow
{
    Get-Process -Name PowerShell -PSComputerName Server01, Server 12
    InlineScript { Get-Variable -Name PSHome } -PSRunningTimeoutSec 3600

    #No activity common parameters.
    Get-WindowsFeature -Name PowerShell, PowerShell-v2  

    #No activity common parameters.
    320GB / 3MB
}

Zie Activiteiten gebruiken in scriptwerkstromen voor meer informatie over de algemene activiteitsparameters.

Algemene parameterwaarden ophalen

Windows PowerShell Workflow voegt de runtimevariabelen voor werkstromen toe aan alle werkstromen. De runtimevariabelen voor werkstromen bevatten de waarden van de algemene parameters, de algemene werkstroomparameters en andere waarden die essentieel zijn voor de werkstromen.

De variabele waarden zijn bijzonder nuttig. Neem de tijd om ze te bekijken en te gebruiken in uw werkstromen. Bijvoorbeeld: bij het uitvoeren van een werkstroom accepteert de parameter PSComputerName de namen van de doelcomputers, maar wanneer u de variabele $PSComputerName gebruikt in een werkstroom, bevat deze de naam van de computer waarop de werkstroom momenteel wordt uitgevoerd.

Zie PSWorkflowRuntimeVariable Enumeration (Engelstalig) voor meer informatie over de werkstroomruntimevariabelen.

Voor toegang tot de parameterwaarden vanuit de werkstroom gebruikt u de naam van de variabele. U hoeft de variabele niet te definiëren.

In de volgende werkstroom wordt bijvoorbeeld de waarde van de algemene parameter PSConnectionRetryCount gebruikt door ernaar te verwijzen als de $PSConnectionRetryCount-variabele.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
}

In het volgende voorbeeld ziet u dat wanneer u de parameter PSConnectionRetryCount gebruikt bij het uitvoeren van de werkstroom, de parameterwaarde zichtbaar is in de werkstroom.

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.

U kunt de waarden van de runtimeparameters en de algemene parameters in een werkstroom wijzigen met de activiteit Set-PSWorkflowData.

De volgende werkstroom bevat bijvoorbeeld een opdracht die de waarde van PSConnectionRetryCount wijzigt.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
    Set-PSWorkflowData -PSConnectionRetryCount 5
    "Retry count is $PSConnectionRetryCount."
}

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.
Retry count is 5.

Zie de volgende Help-onderwerpen voor meer informatie over variabelen in Windows PowerShell Workflow.

Runtimevariabelen en algemene parameterwaarden ophalen

Windows PowerShell Workflow voegt de runtimevariabelen voor werkstromen toe aan alle werkstromen. De runtimevariabelen voor werkstromen bevatten de waarden van de algemene parameters, de algemene werkstroomparameters en andere waarden die essentieel zijn voor de werkstromen.

De variabele waarden zijn bijzonder nuttig. Neem de tijd om ze te bekijken en te gebruiken in uw werkstromen. Bijvoorbeeld: bij het uitvoeren van een werkstroom accepteert de parameter PSComputerName de namen van de doelcomputers, maar wanneer u de variabele $PSComputerName gebruikt in een werkstroom, bevat deze de naam van de computer waarop de werkstroom momenteel wordt uitgevoerd.

Zie PSWorkflowRuntimeVariable Enumeration (Engelstalig) voor meer informatie over de werkstroomruntimevariabelen.

Voor toegang tot de parameterwaarden vanuit de werkstroom gebruikt u de naam van de variabele. U hoeft de variabele niet te definiëren.

In de volgende werkstroom wordt bijvoorbeeld de waarde van de algemene parameter PSConnectionRetryCount gebruikt door ernaar te verwijzen als de $PSConnectionRetryCount-variabele.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
}

In het volgende voorbeeld ziet u dat wanneer u de parameter PSConnectionRetryCount gebruikt bij het uitvoeren van de werkstroom, de parameterwaarde zichtbaar is in de werkstroom.

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.

U kunt de waarden van de runtimeparameters en de algemene parameters in een werkstroom wijzigen met de activiteit Set-PSWorkflowData.

De volgende werkstroom bevat bijvoorbeeld een opdracht die de waarde van PSConnectionRetryCount wijzigt.

workflow Test-Workflow
{
    "Retry count is $PSConnectionRetryCount."
    Set-PSWorkflowData -PSConnectionRetryCount 5
    "Retry count is $PSConnectionRetryCount."
}

PS C:\>Test-Workflow -PSConnectionRetryCount 4
Retry count is 4.
Retry count is 5.

Zie de volgende Help-onderwerpen voor meer informatie over variabelen in Windows PowerShell Workflow.

Een script uitvoeren in een werkstroom

Voor het uitvoeren van een script (een PS1-bestand) in een werkstroom, neemt u de aanroep van het script op in een InlineScript-activiteit. Net als andere opdrachten en activiteiten wordt het script uitgevoerd op alle doelcomputers van de werkstroom en wordt de uitvoer geretourneerd naar de werkstroom.

De volgende werkstroom bevat bijvoorbeeld een InlineScript-activiteit waardoor een script wordt uitgevoerd. Het script wordt opgeslagen in een gedeelde map. De werkstroom maakt gebruik van de activiteitsparameter PSPersist om een controlepunt te nemen wanneer het script is voltooid.

workflow Test-Workflow
{
   $AssetData =InlineScript {\\Server01\Share01\Get-AssetData.ps1 -All} -PSPersist
   ...
}

Omdat werkstromen worden ontworpen om ze uit te voeren op meerdere computers, gebruikt u een absoluut pad naar het scriptbestand in plaats van een relatief pad.

Opdrachten parallel uitvoeren

Met de sleutelwoorden Parallel en ForEach -Parallel optimaliseert u een werkstroom door opdrachten gelijktijdig en in onbepaalde volgorde te laten uitvoeren. Met het sleutelwoord Sequence worden geselecteerde opdrachten na elkaar uitgevoerd binnen een Parallel-scriptblok. Deze sleutelwoorden zijn alleen geldig in een werkstroom. Ze zijn geldig in geneste werkstromen, maar niet in geneste functies in een werkstroom. Standaard worden opdrachten na elkaar uitgevoerd, waarbij elke opdracht wordt voltooid voordat de volgende opdracht wordt gestart.

Omdat parallelle uitvoering belangrijke prestatieverbetering kan opleveren, met name wanneer de werkstroom bestemd is voor meerdere computers, gebruikt u deze altijd indien mogelijk.

De volgende typen opdrachten en activiteiten zijn geschikt voor parallelle uitvoering.

  • Opdrachten die geen gegevens delen, zoals Get-Process en Get-Service.

  • Opdrachten die worden uitgevoerd op een verzameling van soortgelijke objecten. De meeste ForEach-instructies zijn goede kandidaten voor uitvoering als ForEach -Parallel.

Parallel

De opdrachten in een Parallel-scriptblok kunnen tegelijkertijd worden uitgevoerd. De volgorde waarin ze worden uitgevoerd, staat niet vast.

In het volgende diagram ziet u de syntaxis van een werkstroom met het sleutelwoord en scriptblok Parallel.

workflow Test-Workflow
{
    Parallel
    {
         <Activity>
         <Activity>
...
    }
}

De volgende werkstroom bevat bijvoorbeeld een Parallel-scriptblok waarmee activiteiten worden uitgevoerd die processen en services op de computer plaatsen. Omdat de aanroepen van Get-Process en Get-Service onafhankelijk van elkaar zijn, kunnen ze tegelijkertijd worden uitgevoerd en in een willekeurige volgorde.

workflow Test-Workflow
{
    Parallel
    {
         Get-Process
         Get-Service
    }
}

ForEach-Parallel

Met de parameter Parallel van het sleutelwoord ForEach worden de opdrachten voor elk item van de opgegeven verzameling eenmaal uitgevoerd in een ForEach-scriptblok. De objecten in de verzameling worden parallel verwerkt. De opdrachten in het scriptblok worden opeenvolgend uitgevoerd.

Net als de instructie ForEach in Windows PowerShell moet de variabele die de verzameling bevat ($<Collection>) worden gedefinieerd vóór de ForEach -Parallel-instructie, maar wordt de variabele die staat voor het huidige item ($<item>) in de ForEach -Parallel-instructie gedefinieerd.

Het volgende diagram toont de opdrachtsyntaxis.

workflow Test-Workflow
{
    ForEach -Parallel ($<item> in $<collection>)
    {
       <Activity1>
       <Activity2>
 ...
    }
}

De volgende werkstroom bevat bijvoorbeeld een Foreach -Parallel-instructie die de schijven verwerkt die door de activiteit Get-Disk worden opgehaald. De opdrachten in het scriptblok worden na elkaar uitgevoerd, maar ze worden parallel uitgevoerd op de schijven.

workflow Test-Workflow
{
    $Disks = Get-Disk
    ForEach -Parallel ($Disk in $Disks)
    {
        $DiskPath = $Disk.Path   
        $Disk | Initialize-Disk
        Set-Disk -Path $DiskPath
    }
}

Reeks

Met het sleutelwoord Sequence worden opdrachten na elkaar uitgevoerd binnen een Parallel-scriptblok. Het Sequence-scriptblok wordt parallel met andere opdrachten uitgevoerd, maar de opdrachten binnen het scriptblok worden na elkaar en in de opgegeven volgorde uitgevoerd.

In het volgende codeblok ziet u de syntaxis van een Sequence-scriptblok. Activiteit 3 kan worden uitgevoerd vóór of op hetzelfde moment als activiteit 1 en 2, maar activiteit 4 wordt niet uitgevoerd totdat activiteit 3 voltooid is.

workflow Test-Workflow
{
    parallel
    {
       <Activity1>
       <Activity2>

       sequence 
       {
           <Activity3>
           <Activity4>
           ...
       }
        ...
    }
}