Lära dig viktiga begrepp i Windows PowerShell-arbetsflöde för Automation-runbooksLearning key Windows PowerShell Workflow concepts for Automation runbooks

Azure Automation-Runbooks implementeras som Windows PowerShell-arbetsflöden.Runbooks in Azure Automation are implemented as Windows PowerShell Workflows. Ett Windows PowerShell-arbetsflöde är liknar ett Windows PowerShell-skript men vissa viktiga skillnader som kan vara förvirrande för en ny användare.A Windows PowerShell Workflow is similar to a Windows PowerShell script but has some significant differences that can be confusing to a new user. Även den här artikeln är avsedd att hjälpa dig att skriva runbooks med PowerShell-arbetsflöde, rekommenderar vi att du skriver runbooks med PowerShell om du inte behöver kontrollpunkter.While this article is intended to help you write runbooks using PowerShell workflow, we recommend you write runbooks using PowerShell unless you need checkpoints. Det finns flera skillnader i syntaxen vid redigering av PowerShell Workflow-runbooks och dessa skillnader kräver lite mer arbete att skriva effektiva arbetsflöden.There are several syntax differences when authoring PowerShell Workflow runbooks and these differences require a bit more work to write effective workflows.

Ett arbetsflöde är en sekvens med programmerade, nätverksanslutna steg som utför tidskrävande uppgifter eller kräver samordning av flera steg i flera enheter eller hanterade noder.A workflow is a sequence of programmed, connected steps that perform long-running tasks or require the coordination of multiple steps across multiple devices or managed nodes. Fördelarna med ett arbetsflöde jämfört med ett vanligt skript är möjligheten att samtidigt kunna utföra en åtgärd på flera enheter och möjligheten att automatisk återställning vid fel.The benefits of a workflow over a normal script include the ability to simultaneously perform an action against multiple devices and the ability to automatically recover from failures. Ett Windows PowerShell-arbetsflöde är ett Windows PowerShell-skript som använder Windows Workflow Foundation.A Windows PowerShell Workflow is a Windows PowerShell script that uses Windows Workflow Foundation. När arbetsflödet skrivs med Windows PowerShell-syntax och startas också av Windows PowerShell, bearbetas det av Windows Workflow Foundation.While the workflow is written with Windows PowerShell syntax and launched by Windows PowerShell, it is processed by Windows Workflow Foundation.

Mer information om ämnena i den här artikeln finns komma igång med Windows PowerShell-arbetsflöde.For complete details on the topics in this article, see Getting Started with Windows PowerShell Workflow.

Grundstrukturen för ett arbetsflödeBasic structure of a workflow

Det första steget för att konvertera ett PowerShell-skript i ett PowerShell-arbetsflöde är omslutande den med den arbetsflöde nyckelord.The first step to converting a PowerShell script to a PowerShell workflow is enclosing it with the Workflow keyword. Ett arbetsflöde som börjar med den arbetsflöde följt av skriptkoden omgiven av klammerparenteser.A workflow starts with the Workflow keyword followed by the body of the script enclosed in braces. Namnet på arbetsflödet följer den arbetsflöde nyckelord som du ser i följande syntax:The name of the workflow follows the Workflow keyword as shown in the following syntax:

Workflow Test-Workflow
{
    <Commands>
}

Namnet på arbetsflödet måste matcha namnet på Automation-runbook.The name of the workflow must match the name of the Automation runbook. Om runbook importeras sedan filnamnet måste matcha namnet på arbetsflödet och måste sluta med .ps1.If the runbook is being imported, then the filename must match the workflow name and must end in .ps1.

Om du vill lägga till parametrar i arbetsflödet genom att använda den Param nyckelordet precis som du skulle för ett skript.To add parameters to the workflow, use the Param keyword just as you would to a script.

KodändringarCode changes

PowerShell-arbetsflödeskod verkar nästan identiska med PowerShell-skriptkoden förutom några betydande förändringar.PowerShell workflow code looks almost identical to PowerShell script code except for a few significant changes. I följande avsnitt beskrivs ändringar som du behöver göra i ett PowerShell-skript för att den ska köras i ett arbetsflöde.The following sections describe changes that you need to make to a PowerShell script for it to run in a workflow.

AktiviteterActivities

En aktivitet är en viss uppgift i ett arbetsflöde.An activity is a specific task in a workflow. Precis som ett skript består av ett eller flera kommandon, består ett arbetsflöde av en eller flera aktiviteter som utförs i en sekvens.Just as a script is composed of one or more commands, a workflow is composed of one or more activities that are carried out in a sequence. Windows PowerShell-arbetsflöde konverterar automatiskt många av Windows PowerShell-cmdlets för aktiviteter när ett arbetsflöde körs.Windows PowerShell Workflow automatically converts many of the Windows PowerShell cmdlets to activities when it runs a workflow. När du anger en av dessa cmdletar i din runbook körs motsvarande aktivitet av Windows Workflow Foundation.When you specify one of these cmdlets in your runbook, the corresponding activity is run by Windows Workflow Foundation. För cmdletar där en motsvarande aktivitet saknas, körs Windows PowerShell-arbetsflöde automatiskt cmdleten i en InlineScript aktivitet.For those cmdlets without a corresponding activity, Windows PowerShell Workflow automatically runs the cmdlet within an InlineScript activity. Det finns en uppsättning cmdletar som är undantagna och inte kan användas i ett arbetsflöde om du uttryckligen lägga till dem i ett InlineScript-block.There is a set of cmdlets that are excluded and cannot be used in a workflow unless you explicitly include them in an InlineScript block. Mer information om de här koncepten finns med hjälp av aktiviteter i Skriptarbetsflöden.For further details on these concepts, see Using Activities in Script Workflows.

Arbetsflödesaktiviteter delar en uppsättning gemensamma parametrar för konfiguration av deras funktion.Workflow activities share a set of common parameters to configure their operation. Mer information om arbetsflödets gemensamma parametrar finns about_WorkflowCommonParameters.For details about the workflow common parameters, see about_WorkflowCommonParameters.

PositionsparametrarPositional parameters

Du kan inte använda namngivna parametrar med aktiviteter och cmdlets i ett arbetsflöde.You can't use positional parameters with activities and cmdlets in a workflow. Det innebär att är att du måste använda parameternamn.All this means is that you must use parameter names.

Tänk dig följande kod som hämtar alla tjänster som körs.For example, consider the following code that gets all running services.

Get-Service | Where-Object {$_.Status -eq "Running"}

Om du försöker köra samma kod i ett arbetsflöde, får du ett meddelande som ”parameteruppsättningen inte kan matchas med angiven namngivna parametrarna”.If you try to run this same code in a workflow, you receive a message like "Parameter set cannot be resolved using the specified named parameters." Åtgärda detta genom att ange parameternamnet enligt följande.To correct this, provide the parameter name as in the following.

Workflow Get-RunningServices
{
    Get-Service | Where-Object -FilterScript {$_.Status -eq "Running"}
}

Avserialiserade objektDeserialized objects

Objekt i arbetsflöden är deserialisera.Objects in workflows are deserialized. Det innebär att deras egenskaper är fortfarande tillgängliga, men inte deras metoder.This means that their properties are still available, but not their methods. Tänk dig följande PowerShell-kod som stoppar en tjänst som Stop-metoden i objektet.For example, consider the following PowerShell code that stops a service using the Stop method of the Service object.

$Service = Get-Service -Name MyService
$Service.Stop()

Om du försöker köra det i ett arbetsflöde, får du ett felmeddelande som säger ”metodanropet inte stöds i ett Windows PowerShell-arbetsflöde”.If you try to run this in a workflow, you receive an error saying "Method invocation is not supported in a Windows PowerShell Workflow."

Ett alternativ är att omsluta följande två rader med kod i en InlineScript blockera i vilket fall $Service skulle vara en serviceobjektet i blocket.One option is to wrap these two lines of code in an InlineScript block in which case $Service would be a service object within the block.

Workflow Stop-Service
{
    InlineScript {
        $Service = Get-Service -Name MyService
        $Service.Stop()
    }
}

Ett annat alternativ är att använda en annan cmdlet som utför samma funktioner som metoden, om någon är tillgänglig.Another option is to use another cmdlet that performs the same functionality as the method, if one is available. Cmdlet Stop-Service fungerar på samma sätt som Stop-metod i vårt exempel och du kan använda följande för ett arbetsflöde.In our sample, the Stop-Service cmdlet provides the same functionality as the Stop method, and you could use the following for a workflow.

Workflow Stop-MyService
{
    $Service = Get-Service -Name MyService
    Stop-Service -Name $Service.Name
}

InlineScriptInlineScript

Den InlineScript aktivitet är användbart när du vill köra ett eller flera kommandon som för traditionella PowerShell-skript i stället för PowerShell-arbetsflöde.The InlineScript activity is useful when you need to run one or more commands as traditional PowerShell script instead of PowerShell workflow. Medan kommandon i ett arbetsflöde skickas till Windows Workflow Foundation för bearbetning, bearbetas kommandona i ett InlineScript-block av Windows PowerShell.While commands in a workflow are sent to Windows Workflow Foundation for processing, commands in an InlineScript block are processed by Windows PowerShell.

InlineScript använder du följande syntax som visas nedan.InlineScript uses the following syntax shown below.

InlineScript
{
    <Script Block>
} <Common Parameters>

Du kan returnera utdata från en InlineScript genom att tilldela utdatan till en variabel.You can return output from an InlineScript by assigning the output to a variable. I följande exempel stoppar en tjänst och som sedan returnerar namnet på tjänsten.The following example stops a service and then outputs the service name.

Workflow Stop-MyService
{
    $Output = InlineScript {
        $Service = Get-Service -Name MyService
        $Service.Stop()
        $Service
    }

    $Output.Name
}

Du kan skicka värden i ett InlineScript-block, men du måste använda $Using omfångsmodifieraren.You can pass values into an InlineScript block, but you must use $Using scope modifier. I följande exempel är identiskt med föregående exempel förutom att namnet på tjänsten tillhandahålls av en variabel.The following example is identical to the previous example except that the service name is provided by a variable.

Workflow Stop-MyService
{
    $ServiceName = "MyService"

    $Output = InlineScript {
        $Service = Get-Service -Name $Using:ServiceName
        $Service.Stop()
        $Service
    }

    $Output.Name
}

Medan InlineScript aktiviteter kan vara nödvändiga i vissa arbetsflöden, stöder inte arbetsflödet konstruktioner och bör endast användas när det är nödvändigt av följande skäl:While InlineScript activities may be critical in certain workflows, they do not support workflow constructs and should only be used when necessary for the following reasons:

  • Du kan inte använda kontrollpunkter i ett InlineScript-block.You cannot use checkpoints inside an InlineScript block. Om ett fel uppstår i kodblocket, måste det köras från början av blocket.If a failure occurs within the block, it must be resumed from the beginning of the block.
  • Du kan inte använda parallell körning inuti en InlineScriptBlock.You cannot use parallel execution inside an InlineScriptBlock.
  • InlineScript påverkar arbetsflödet skalbarhet eftersom den innehåller Windows PowerShell-sessionen för InlineScript-blockets hela längd.InlineScript affects scalability of the workflow since it holds the Windows PowerShell session for the entire length of the InlineScript block.

Läs mer om hur du använder InlineScript som kör Windows PowerShell-kommandon i ett arbetsflöde och about_InlineScript.For more information on using InlineScript, see Running Windows PowerShell Commands in a Workflow and about_InlineScript.

Parallell bearbetningParallel processing

En fördel med Windows PowerShell-arbetsflöden är möjligheten att utföra en uppsättning kommandon parallellt i stället för sekventiellt som i ett vanligt skript.One advantage of Windows PowerShell Workflows is the ability to perform a set of commands in parallel instead of sequentially as with a typical script.

Du kan använda den parallella nyckelord för att skapa ett skriptblock med flera kommandon som körs samtidigt.You can use the Parallel keyword to create a script block with multiple commands that run concurrently. Detta använder du följande syntax som visas nedan.This uses the following syntax shown below. I det här fallet kommer Activity1 och Activity2 som startar på samma gång.In this case, Activity1 and Activity2 starts at the same time. Activity3 startas endast efter att både Activity1 och Activity2 har slutförts.Activity3 starts only after both Activity1 and Activity2 have completed.

Parallel
{
    <Activity1>
    <Activity2>
}
<Activity3>

Tänk dig följande PowerShell-kommandon som kopierar du flera filer till ett mål för nätverket.For example, consider the following PowerShell commands that copy multiple files to a network destination. Dessa kommandon körs sekventiellt så att en fil måste avslutas kopiera innan nästa startas.These commands are run sequentially so that one file must finish copying before the next is started.

Copy-Item -Path C:\LocalPath\File1.txt -Destination \\NetworkPath\File1.txt
Copy-Item -Path C:\LocalPath\File2.txt -Destination \\NetworkPath\File2.txt
Copy-Item -Path C:\LocalPath\File3.txt -Destination \\NetworkPath\File3.txt

Följande arbetsflöde kör samma kommandon parallellt så att de alla börjar kopiera på samma gång.The following workflow runs these same commands in parallel so that they all start copying at the same time. Endast när de har alla är kopierade visas slutförandemeddelandet.Only after they are all copied is the completion message displayed.

Workflow Copy-Files
{
    Parallel
    {
        Copy-Item -Path "C:\LocalPath\File1.txt" -Destination "\\NetworkPath"
        Copy-Item -Path "C:\LocalPath\File2.txt" -Destination "\\NetworkPath"
        Copy-Item -Path "C:\LocalPath\File3.txt" -Destination "\\NetworkPath"
    }

    Write-Output "Files copied."
}

Du kan använda den ForEach-Parallel konstruktion kommandon bearbetas parallellt för varje objekt i en samling.You can use the ForEach -Parallel construct to process commands for each item in a collection concurrently. Objekt i samlingen bearbetas parallellt medan kommandona i skriptblocket körs sekventiellt.The items in the collection are processed in parallel while the commands in the script block run sequentially. Detta använder du följande syntax som visas nedan.This uses the following syntax shown below. I det här fallet startar kommer Activity1 på samma gång för alla objekt i samlingen.In this case, Activity1 starts at the same time for all items in the collection. För varje objekt startar Activity2 efter att Activity1 har slutförts.For each item, Activity2 starts after Activity1 is complete. Activity3 startas endast efter att både Activity1 och Activity2 har slutförts för alla objekt.Activity3 starts only after both Activity1 and Activity2 have completed for all items. Vi använder den ThrottleLimit parametern för att begränsa parallellitet.We use the ThrottleLimit parameter to limit the parallelism. För hög en ThrottleLimit kan orsaka problem.Too high of a ThrottleLimit can cause problems. Perfekt värdet för den ThrottleLimit parametern beror på många faktorer i din miljö.The ideal value for the ThrottleLimit parameter depends on many factors in your environment. Du bör börja med ett lågt värde och försök olika ökande värden tills du hittar en som fungerar för din specifika situation.You should try start with a low value and try different increasing values until you find one that works for your specific circumstance.

ForEach -Parallel -ThrottleLimit 10 ($<item> in $<collection>)
{
    <Activity1>
    <Activity2>
}
<Activity3>

I följande exempel liknar det föregående exemplet kopierar filer parallellt.The following example is similar to the previous example copying files in parallel. I det här fallet visas ett meddelande för varje fil när kopieras.In this case, a message is displayed for each file after it copies. Endast när de har alla visas helt kopieras det sista meddelandet.Only after they are all completely copied is the final completion message displayed.

Workflow Copy-Files
{
    $files = @("C:\LocalPath\File1.txt","C:\LocalPath\File2.txt","C:\LocalPath\File3.txt")

    ForEach -Parallel -ThrottleLimit 10 ($File in $Files)
    {
        Copy-Item -Path $File -Destination \\NetworkPath
        Write-Output "$File copied."
    }

    Write-Output "All files copied."
}

Anteckning

Vi rekommenderar inte underordnade runbooks som körs parallellt eftersom det har visat sig ge otillförlitliga resultat.We do not recommend running child runbooks in parallel since this has been shown to give unreliable results. Utdata från den underordnade runbooken ibland visas inte och inställningar i en underordnad runbook kan påverka andra parallella underordnade runbooks.The output from the child runbook sometimes does not show up, and settings in one child runbook can affect the other parallel child runbooks. Till exempel $VerbosePreference och $WarningPreference kan inte spridas till underordnade runbooks.Variables such as $VerbosePreference, $WarningPreference, and others may not be propagated to the child runbooks. Och om den underordnade runbooken ändras dessa värden kan de kanske inte korrekt återställas efter anrop.And if the child runbook changes these values, they may not be properly restored after invocation.

KontrollpunkterCheckpoints

En kontrollpunkt är en ögonblicksbild av det aktuella tillståndet för arbetsflödet som innehåller det aktuella värdet för variabler och all utdata som genererats till den punkten.A checkpoint is a snapshot of the current state of the workflow that includes the current value for variables and any output generated to that point. Om ett arbetsflöde slutar i fel eller är inaktiverad, sedan börjar nästa gång den körs den från den senaste kontrollpunkten istället för i början av arbetsflödet.If a workflow ends in error or is suspended, then the next time it is run it will start from its last checkpoint instead of the start of the workflow. Du kan ange en kontrollpunkt i ett arbetsflöde med den Checkpoint-Workflow aktivitet.You can set a checkpoint in a workflow with the Checkpoint-Workflow activity. Azure Automation har en funktion som kallas rättmätiga del, där valfri runbook som körs i tre timmar är tas bort från minnet för att tillåta körning av andra runbooks.Azure Automation has a feature called fair share, where any runbook that runs for 3 hours is unloaded to allow other runbooks to run. Slutligen bort från minnet runbook ska läsas och när det är de återupptas om körning från den senaste kontrollpunkten som vidtagits i runbooken.Eventually, the unloaded runbook will be reloaded, and when it is, it will resume execution from the last checkpoint taken in the runbook. För att säkerställa att runbooken slutförs så småningom måste du lägga till kontrollpunkter med intervall som körs i mindre än tre timmar.In order to guarantee that the runbook will eventually complete, you must add checkpoints at intervals that run for less than 3 hours. Under varje körning läggs till en ny kontrollpunkt, och om runbooken som hämtar avlägsnas efter 3 timmar på grund av ett fel, sedan fortsätter runbook på obestämd tid.If during each run a new checkpoint is added, and if the runbook gets evicted after 3 hours due to an error, then the runbook will be resumed indefinitely.

I följande exempelkod, ett undantag som inträffar efter Activity2 orsakar arbetsflödet ska sluta.In the following sample code, an exception occurs after Activity2 causing the workflow to end. När arbetsflödet körs igen, startar genom att köra Activity2 eftersom det bara när den senast lagrade kontrollpunkten.When the workflow is run again, it starts by running Activity2 since this was just after the last checkpoint set.

<Activity1>
Checkpoint-Workflow
<Activity2>
<Exception>
<Activity3>

Du bör ange kontrollpunkter i ett arbetsflöde efter aktiviteter som kan vara utsatt för undantag och inte ska upprepas om arbetsflödet återupptas.You should set checkpoints in a workflow after activities that may be prone to exception and should not be repeated if the workflow is resumed. Ditt arbetsflöde kan till exempel skapa en virtuell dator.For example, your workflow may create a virtual machine. Du kan ange en kontrollpunkt både före och efter kommandona för att skapa den virtuella datorn.You could set a checkpoint both before and after the commands to create the virtual machine. Om misslyckas, skulle sedan kommandona upprepas om arbetsflödet startas igen.If the creation fails, then the commands would be repeated if the workflow is started again. Om arbetsflödet misslyckas när skapandet lyckas, sedan skapas den virtuella datorn inte igen när arbetsflödet återupptas.If the workflow fails after the creation succeeds, then the virtual machine will not be created again when the workflow is resumed.

I följande exempel kopierar flera filer till en nätverksplats och anger en kontrollpunkt efter varje fil.The following example copies multiple files to a network location and sets a checkpoint after each file. Om klientens nätverksplats tappas bort, slutar arbetsflödet i fel.If the network location is lost, then the workflow ends in error. När den startas igen, fortsätter den på den senaste kontrollpunkten, vilket innebär att endast de filer som redan har kopierats hoppas över.When it is started again, it will resume at the last checkpoint meaning that only the files that have already been copied are skipped.

Workflow Copy-Files
{
    $files = @("C:\LocalPath\File1.txt","C:\LocalPath\File2.txt","C:\LocalPath\File3.txt")

    ForEach ($File in $Files)
    {
        Copy-Item -Path $File -Destination \\NetworkPath
        Write-Output "$File copied."
        Checkpoint-Workflow
    }

    Write-Output "All files copied."
}

Eftersom användarnamn autentiseringsuppgifter inte sparas när du anropar den Suspend-Workflow aktivitet eller när den senaste kontrollpunkten, måste du ange autentiseringsuppgifterna som null och sedan hämta dem igen från arkivet tillgången efter Pausa arbetsflöde eller kontrollpunkt anropas.Because username credentials are not persisted after you call the Suspend-Workflow activity or after the last checkpoint, you need to set the credentials to null and then retrieve them again from the asset store after Suspend-Workflow or checkpoint is called. I annat fall kan du få följande felmeddelande visas: Det går inte att återuppta arbetsflödesjobbet, antingen eftersom persistence data inte kunde sparas helt eller sparat persistence data har skadats. Du måste starta om arbetsflödet.Otherwise, you may receive the following error message: The workflow job cannot be resumed, either because persistence data could not be saved completely, or saved persistence data has been corrupted. You must restart the workflow.

Följande samma kod visar hur du hanterar detta i PowerShell Workflow-runbooks.The following same code demonstrates how to handle this in your PowerShell Workflow runbooks.

workflow CreateTestVms
{
    $Cred = Get-AzureAutomationCredential -Name "MyCredential"
    $null = Connect-AzureRmAccount -Credential $Cred

    $VmsToCreate = Get-AzureAutomationVariable -Name "VmsToCreate"

    foreach ($VmName in $VmsToCreate)
        {
        # Do work first to create the VM (code not shown)

        # Now add the VM
        New-AzureRmVm -VM $Vm -Location "WestUs" -ResourceGroupName "ResourceGroup01"

        # Checkpoint so that VM creation is not repeated if workflow suspends
        $Cred = $null
        Checkpoint-Workflow
        $Cred = Get-AzureAutomationCredential -Name "MyCredential"
        $null = Connect-AzureRmAccount -Credential $Cred
        }
}

Viktigt

Add-AzureRmAccount är nu ett alias för Connect-AzureRMAccount.Add-AzureRmAccount is now an alias for Connect-AzureRMAccount. När sökningen biblioteket objekt, om du inte ser Connect-AzureRMAccount, du kan använda Add-AzureRmAccount, eller så kan du uppdatera dina moduler i ditt Automation-konto.When searching your library items, if you do not see Connect-AzureRMAccount, you can use Add-AzureRmAccount, or you can update your modules in your Automation Account.

Detta är inte nödvändigt om du autentiserar med hjälp av ett kör som-konto konfigurerats med ett huvudnamn för tjänsten.This is not required if you are authenticating using a Run As account configured with a service principal.

Mer information om kontrollpunkter finns att lägga till kontrollpunkter till ett arbetsflöde för skript.For more information about checkpoints, see Adding Checkpoints to a Script Workflow.

Nästa stegNext steps