Lär dig mer om PowerShell-arbetsflöde för Azure AutomationLearn PowerShell Workflow for Azure Automation

Runbooks i Azure Automation implementeras som Windows PowerShell-arbetsflöden, Windows PowerShell-skript som använder Windows Workflow Foundation.Runbooks in Azure Automation are implemented as Windows PowerShell workflows, Windows PowerShell scripts that use Windows Workflow Foundation. 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.

När ett arbets flöde skrivs med Windows PowerShell-syntax och startas av Windows PowerShell bearbetas det av Windows Workflow Foundation.While a workflow is written with Windows PowerShell syntax and launched by Windows PowerShell, it is processed by Windows Workflow Foundation. Fördelarna med ett arbets flöde över ett normalt skript inkluderar samtidig prestanda för en åtgärd mot flera enheter och automatisk återställning från haverier.The benefits of a workflow over a normal script include simultaneous performance of an action against multiple devices and automatic recovery from failures.

Anteckning

Ett PowerShell-arbetsflöde skript liknar ett Windows PowerShell-skript men har några viktiga skillnader som kan vara förvirrande för en ny användare.A PowerShell Workflow script is very similar to a Windows PowerShell script but has some significant differences that can be confusing to a new user. Därför rekommenderar vi att du bara skriver dina Runbooks med hjälp av PowerShell-arbetsflöde om du behöver använda kontroll punkter.Therefore, we recommend that you write your runbooks using PowerShell Workflow only if you need to use checkpoints.

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

Använd arbets flödets nyckelordUse Workflow keyword

Det första steget för att konvertera ett PowerShell-skript till ett PowerShell-arbetsflöde är att stänga det med Workflow nyckelordet.The first step to converting a PowerShell script to a PowerShell workflow is enclosing it with the Workflow keyword. Ett arbets flöde börjar med Workflow nyckelordet följt av bröd texten i skriptet som omges av klammerparenteser.A workflow starts with the Workflow keyword followed by the body of the script enclosed in braces. Namnet på arbets flödet följer Workflow nyckelordet som det visas 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å arbets flödet måste matcha namnet på Automation-runbooken.The name of the workflow must match the name of the Automation runbook. Om runbooken importeras måste fil namnet matcha arbets flödets namn och måste sluta med . ps1.If the runbook is being imported, then the file name must match the workflow name and must end in .ps1.

Om du vill lägga till parametrar i arbets flödet använder Param du nyckelordet precis som i ett skript.To add parameters to the workflow, use the Param keyword just as you would in a script.

Lär dig skillnader mellan PowerShell-arbetsflöde och kod för PowerShell-skriptLearn differences between PowerShell Workflow code and PowerShell script code

PowerShell-arbetsflödet ser nästan likadant ut som skript kod med PowerShell förutom några få betydande ä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 måste göra i ett PowerShell-skript för att det ska kunna köras i ett arbets flö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 speciell uppgift i ett arbets flöde som utförs i en sekvens.An activity is a specific task in a workflow that is performed in a sequence. När ett arbetsflöde körs i Windows PowerShell konverteras många Windows PowerShell-cmdletar automatiskt till aktiviteter.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 med Windows Workflow Foundation.When you specify one of these cmdlets in your runbook, the corresponding activity is run by Windows Workflow Foundation.

Om en cmdlet saknar motsvarande aktivitet, kör Windows PowerShell-arbetsflöde automatiskt cmdleten i en InlineScript -aktivitet.If a cmdlet has no corresponding activity, Windows PowerShell Workflow automatically runs the cmdlet in an InlineScript activity. Vissa cmdletar undantas och kan inte användas i ett arbets flöde om du inte uttryckligen inkluderar dem i ett InlineScript-block.Some cmdlets are excluded and can't be used in a workflow unless you explicitly include them in an InlineScript block. Mer information finns i använda aktiviteter i skript arbets flöden.For more information, 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. Se about_WorkflowCommonParameters.See about_WorkflowCommonParameters.

Positions parametrarPositional parameters

Du kan inte använda positions parametrar med aktiviteter och cmdlets i ett arbets flöde.You can't use positional parameters with activities and cmdlets in a workflow. Därför måste du använda parameter namn.Therefore, you must use parameter names. Överväg följande kod som hämtar alla tjänster som körs:Consider the following code that gets all running services:

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

Om du försöker köra den här koden i ett arbets flöde får du ett meddelande som Parameter set cannot be resolved using the specified named parameters. du kan åtgärda för det här problemet genom att ange parameter namnet, som i följande exempel:If you try to run this code in a workflow, you receive a message like Parameter set cannot be resolved using the specified named parameters. To correct for this issue, provide the parameter name, as in the following example:

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

Avserialiserade objektDeserialized objects

Objekt i arbets flöden deserialiseras, vilket innebär att deras egenskaper fortfarande är tillgängliga, men inte deras metoder.Objects in workflows are deserialized, meaning that their properties are still available, but not their methods. Överväg till exempel följande PowerShell-kod som stoppar en tjänst med hjälp av- Stop metoden för Service objektet.For example, consider the following PowerShell code, which 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 detta i ett arbets flöde får du ett fel meddelande Method invocation is not supported in a Windows PowerShell Workflow.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 figursätta dessa två kodrader i ett InlineScript -block.One option is to wrap these two lines of code in an InlineScript block. I det här fallet Service representerar ett tjänst objekt i blocket.In this case, Service represents 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 har samma funktion som metoden, om en sådan finns.Another option is to use another cmdlet that has the same functionality as the method, if one is available. I vårt exempel Stop-Service tillhandahåller cmdleten samma funktioner som Stop metoden, och du kan använda följande kod för ett arbets flöde.In our example, the Stop-Service cmdlet provides the same functionality as the Stop method, and you might use the following code for a workflow.

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

Använd InlineScriptUse InlineScript

InlineScriptAktiviteten är användbar när du behöver köra ett eller flera kommandon som traditionellt PowerShell-skript i stället för PowerShell-arbetsflöde.TheInlineScript 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 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 utdata till en variabel.You can return output from an InlineScript by assigning the output to a variable. I följande exempel stoppas en tjänst och sedan genereras tjänst namnet.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 till ett InlineScript-block, men du måste använda $using omfångs modifierare.You can pass values into an InlineScript block, but you must use $Using scope modifier. Följande exempel är identiskt med föregående exempel, förutom att tjänst namnet 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
}

Även om InlineScript-aktiviteter kan vara kritiska i vissa arbets flöden, stöder de inte arbets flödes konstruktioner.While InlineScript activities might be critical in certain workflows, they do not support workflow constructs. Du bör endast använda dem när det är nödvändigt av följande anledningar:You should use them only when necessary for the following reasons:

  • Det går inte att använda kontroll punkter i ett InlineScript-block.You can't use checkpoints inside an InlineScript block. Om ett fel inträffar i blocket måste det fortsätta från början av blocket.If a failure occurs within the block, it must resume from the beginning of the block.
  • Du kan inte använda parallell körning i ett InlineScript-block.You can't use parallel execution inside an InlineScript block.
  • InlineScript påverkar skalbarheten för arbets flödet eftersom den innehåller Windows PowerShell-sessionen för hela längden på InlineScript-blocket.InlineScript affects scalability of the workflow since it holds the Windows PowerShell session for the entire length of the InlineScript block.

Mer information om hur du använder InlineScript finns i köra Windows PowerShell-kommandon i ett arbets flöde och about_InlineScript.For more information on using InlineScript, see Running Windows PowerShell Commands in a Workflow and about_InlineScript.

Använd parallell bearbetningUse parallel processing

En av fördelarna 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 Parallel nyckelordet för att skapa ett skript block med flera kommandon som körs samtidigt.You can use the Parallel keyword to create a script block with multiple commands that run concurrently. Följande syntax visas nedan.This uses the following syntax shown below. I det här fallet startar Activity1 och Activity2 på samma tidpunkt.In this case, Activity1 and Activity2 starts at the same time. Activity3 startar bara efter att både Activity1 och Activity2 har slutförts.Activity3 starts only after both Activity1 and Activity2 have completed.

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

Överväg till exempel följande PowerShell-kommandon som kopierar flera filer till ett nätverks mål.For example, consider the following PowerShell commands that copy multiple files to a network destination. Dessa kommandon körs i tur och ordning så att en fil måste slutföras 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 arbets flöde kör samma kommandon parallellt så att alla börjar kopieras samtidigt.The following workflow runs these same commands in parallel so that they all start copying at the same time. När alla har kopierats visas meddelandet slut för ande.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 ForEach -Parallel konstruktion för att bearbeta kommandon för varje objekt i en samling samtidigt.You can use the ForEach -Parallel construct to process commands for each item in a collection concurrently. Objekten 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. I den här processen används följande syntax som visas nedan.This process uses the following syntax shown below. I det här fallet startar Activity1 på samma tid för alla objekt i samlingen.In this case, Activity1 starts at the same time for all items in the collection. Activity2 startar när Activity1 har slutförts för varje objekt.For each item, Activity2 starts after Activity1 is complete. Activity3 startar bara 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 ThrottleLimit parametern för att begränsa parallellitet.We use the ThrottleLimit parameter to limit the parallelism. För hög av a ThrottleLimit kan orsaka problem.Too high of a ThrottleLimit can cause problems. Det idealiska värdet för ThrottleLimit parametern beror på många faktorer i din miljö.The ideal value for the ThrottleLimit parameter depends on many factors in your environment. Börja med ett lågt värde och prova olika ökande värden tills du hittar ett som fungerar för dina speciella omständigheter.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>

Följande exempel liknar det tidigare exemplet som 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 efter att den har kopierats.In this case, a message is displayed for each file after it copies. När alla har kopierats är meddelandet slut för ande visas.Only after they are all 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 att du kör underordnade Runbooks parallellt eftersom detta har visats för att 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 visas ibland inte, och inställningarna i en underordnad Runbook kan påverka de 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. Variabler som VerbosePreference , WarningPreference och andra kanske inte kan spridas till underordnade Runbooks.Variables such as VerbosePreference, WarningPreference, and others might not propagate to the child runbooks. Och om den underordnade runbooken ändrar dessa värden kanske de inte återställs korrekt efter anrop.And if the child runbook changes these values, they might not be properly restored after invocation.

Använda kontroll punkter i ett arbets flödeUse checkpoints in a workflow

En kontroll punkt är en ögonblicks bild av det aktuella läget för det arbets flöde som innehåller de aktuella värdena för variabler och alla utdata som genererats till den punkten.A checkpoint is a snapshot of the current state of the workflow that includes the current values for variables and any output generated to that point. Om ett arbets flöde slutar fungera eller har pausats startar det från den senaste kontroll punkten nästa gång den körs, i stället för att börja vid början.If a workflow ends in error or is suspended, it starts from its last checkpoint the next time it runs, instead of starting at the beginning.

Du kan ange en kontroll punkt i ett arbets flöde med Checkpoint-Workflow aktiviteten.You can set a checkpoint in a workflow with the Checkpoint-Workflow activity. Azure Automation har en funktion som kallas rättvis delning, för vilken alla Runbook-flöden som körs i tre timmar är inaktiverade för att tillåta andra Runbooks att köras.Azure Automation has a feature called fair share, for which any runbook that runs for three hours is unloaded to allow other runbooks to run. Slutligen laddas den inaktiverade runbooken om.Eventually, the unloaded runbook is reloaded. I så fall återupptas körningen från den senaste kontroll punkten som tagits i runbooken.When it is, it resumes execution from the last checkpoint taken in the runbook.

För att garantera att runbooken slutligen slutförs måste du lägga till kontroll punkter i intervall som körs i mindre än tre timmar.To guarantee that the runbook eventually completes, you must add checkpoints at intervals that run for less than three hours. Om du lägger till en ny kontroll punkt under varje körning, och om runbooken avlägsnas efter tre timmar på grund av ett fel, återupptas runbooken under obestämd tid.If during each run a new checkpoint is added, and if the runbook is evicted after three hours due to an error, the runbook is resumed indefinitely.

I följande exempel inträffar ett undantag efter Activity2, vilket gör att arbets flödet slutar.In the following example, an exception occurs after Activity2, causing the workflow to end. När arbets flödet körs igen startar det genom att köra Activity2, eftersom den här aktiviteten precis var efter den senaste kontroll punkts uppsättningen.When the workflow is run again, it starts by running Activity2, since this activity was just after the last checkpoint set.

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

Ange kontroll punkter i ett arbets flöde efter aktiviteter som kan vara känsliga för undantag och som inte bör upprepas om arbets flödet återupptas.Set checkpoints in a workflow after activities that might be prone to exception and should not be repeated if the workflow is resumed. Arbets flödet kan till exempel skapa en virtuell dator.For example, your workflow might create a virtual machine. Du kan ange en kontroll punkt både före och efter kommandon för att skapa den virtuella datorn.You can set a checkpoint both before and after the commands to create the virtual machine. Om det inte går att skapa, upprepas kommandona om arbets flödet startas igen.If the creation fails, then the commands are repeated if the workflow is started again. Om arbets flödet Miss lyckas när skapandet har slutförts skapas inte den virtuella datorn igen när arbets flödet återupptas.If the workflow fails after the creation succeeds, the virtual machine is not created again when the workflow is resumed.

I följande exempel kopieras flera filer till en nätverks plats och anger en kontroll punkt efter varje fil.The following example copies multiple files to a network location and sets a checkpoint after each file. Om nätverks platsen tappas bort slutar arbets flödet med fel.If the network location is lost, then the workflow ends in error. När den startas igen återupptas den vid den senaste kontroll punkten.When it is started again, it resumes at the last checkpoint. Endast filer som redan har kopierats hoppas över.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 autentiseringsuppgifter för användar namn inte är sparade när du anropar aktiviteten pausa – arbets flöde eller efter den senaste kontroll punkten, måste du ange autentiseringsuppgifterna som null och sedan hämta dem igen från till gångs lagret efter det att Suspend-Workflow kontroll punkten har anropats.Because user name 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. Annars kan du få följande fel meddelande: 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.Otherwise, you might 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 kod visar hur du hanterar den här situationen i dina PowerShell Workflow-Runbooks.The following same code demonstrates how to handle this situation in your PowerShell Workflow runbooks.

workflow CreateTestVms
{
    $Cred = Get-AzAutomationCredential -Name "MyCredential"
    $null = Connect-AzAccount -Credential $Cred

    $VmsToCreate = Get-AzAutomationVariable -Name "VmsToCreate"

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

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

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

Anteckning

För icke-grafiska PowerShell-Runbooks Add-AzAccount och Add-AzureRMAccount är alias för Connect-AzAccount.For non-graphical PowerShell runbooks, Add-AzAccount and Add-AzureRMAccount are aliases for Connect-AzAccount. Du kan använda dessa cmdletar, eller så kan du Uppdatera dina moduler i ditt Automation-konto till de senaste versionerna.You can use these cmdlets or you can update your modules in your Automation account to the latest versions. Du kan behöva uppdatera dina moduler även om du precis har skapat ett nytt Automation-konto.You might need to update your modules even if you have just created a new Automation account. Du behöver inte använda dessa cmdlets om du autentiserar med ett Kör som-konto som kon figurer ATS med ett huvud namn för tjänsten.Use of these cmdlets is not required if you are authenticating using a Run As account configured with a service principal.

Mer information om kontroll punkter finns i lägga till kontroll punkter i ett skript arbets flöde.For more information about checkpoints, see Adding Checkpoints to a Script Workflow.

Nästa stegNext steps