Schreiben eines Skriptworkflows

 

Betrifft: Windows Server 2012, Windows Server 2012 R2

In den Themen in diesem Abschnitt wird erklärt, wie Sie einen Workflow in der Skriptsprache Windows PowerShell® schreiben, derselben Sprache, in der Sie Funktionen und Skripts in Windows PowerShell schreiben. Sie können die von Ihnen geschriebenen Workflows an der Befehlszeile ausführen und sie in Skripts und Skriptmodule einschließen.

Informationen zum Schreiben von Workflows in XAML, der systemeigenen Sprache von Windows Workflow Foundation, finden Sie in der MSDN Library unter Writing a Windows PowerShell Workflow.

Planen eines Workflows

Windows PowerShell Workflow ist eine leistungsstarke Lösung, die bei jeder Ausführung Daten von Hunderten von Computern erfassen und Änderungen an den Daten vornehmen kann. Achten Sie bei der Planung des Workflowentwurfs auf Einfachheit und Effizienz. Denken Sie daran, dass der Workflow sich selbst anhalten oder von Benutzern angehalten werden kann. Er kann zudem von zahlreichen PSSessions gesteuert werden, die mit einem einzigen serverseitigen Prozess verbunden sind, Neustarts überdauern und Befehle und Funktionen enthalten, die parallel ausgeführt werden. Jeder Befehl kann außerdem in einer eigenen Sitzung ausgeführt werden.

Berücksichtigen Sie bei der Planung die folgenden Richtlinien:

  • Wenn Sie bisher noch nicht mit Workflows gearbeitet haben, sehen Sie sich die Referenzthemen in diesem Abschnitt an, einschließlich Syntaktische Unterschiede zwischen Skriptworkflows und Skripts.

  • Zählen Sie zu Beginn die Aufgaben auf, die der Workflow durchführen wird. Markieren Sie die Abschnitte, die gleichzeitig ausgeführt werden können oder in einer vorab festgelegten Reihenfolge ausgeführt werden müssen. Markieren Sie innerhalb dieser Abschnitte alle Abschnitte, die in einer Sequenzreihenfolge ausgeführt werden müssen.

  • Organisieren Sie Aufgaben in Funktionen innerhalb des Workflows. Verwenden Sie für jede Aufgabe ein vorhandenes Windows PowerShell-Cmdlet, oder erstellen Sie einen neuen Befehl, und fügen Sie nach jedem wichtigen Schritt einen Prüfpunkt hinzu.

  • Workflows sind auf eine Ausführung auf mehreren Zielcomputern ausgelegt. Sie müssen im Workflow keine Remotesitzungen erstellen oder Remotebefehle verwenden, beispielsweise solche, die das Invoke-Command-Cmdlet verwenden.

  • Wie bei jedem Skript, das auf mehreren Computern ausgeführt wird, sollten Sie Abweichungen unter den Computern berücksichtigen, die sich auf den Skriptvorgang auswirken können, darunter Abweichungen bei Betriebssystemen, Geräten, der Dateisystemorganisation, Umgebungsvariablen und Windows PowerShell-Versionen.

  • Planen Sie die Hilfethemen für den Workflow im Voraus. Zeichnen Sie die Informationen auf, die Sie Benutzern mitteilen müssen, beispielsweise eine bevorzugte Workflowarchitektur, bevorzugte Konfigurationseigenschaften für Sitzungen und Berechtigungen.

Verwenden Sie zum Schreiben des Workflows einen Skript-Editor wie Windows PowerShell Integrated Scripting Environment (ISE), der die Workflowsyntax erzwingt und Syntaxfehler hervorhebt. Die syntaktischen Unterschiede zwischen Skripts und Workflows sind erheblich, deshalb können Sie mit einem Tool, das sowohl Workflows als auch Skripts kennt, viel Zeit beim Codieren und Testen sparen.

Informationen zu Aufgaben, die für Workflows gut geeignet sind, finden Sie unter Einführung in Windows PowerShell Workflow im Abschnitt zu den Unterschieden zwischen Workflows und Windows PowerShell-Skripts.

Das workflow-Schlüsselwort

Beginnen Sie mit dem Schlüsselwort workflow, das einen Workflowbefehl für Windows PowerShell identifiziert. Das Schlüsselwort workflow ist in einem Skriptworkflow erforderlich. Nach dem Schlüsselwort workflow folgt der Name des Workflows. Der Textkörper des Workflows ist in Klammern eingeschlossen.

Im Folgenden ist das Syntaxdiagramm für das Schlüsselwort Workflow dargestellt.

workflow Test-Workflow
{
    ...
}

Weitere Informationen zu Schlüsselwörtern in der Skriptsprache Windows PowerShell finden Sie unter about_Language_Keywords.

Benennen von Workflows und Workflowelementen

Ein Workflow ist ein Windows PowerShell-Befehlstyp. Wählen Sie einen Namen im Verb-Nomen-Format aus. Verwenden Sie das Cmdlet Get-Verb und das Hilfethema Approved Verbs for Windows PowerShell Commands, um ein genehmigtes Verb für den Namen auszuwählen.Windows PowerShell generiert eine Warnung, wenn Befehle, die keine genehmigten Verben enthalten, aus einem Modul importiert werden. Verwenden Sie ein beschreibendes Nomen und gegebenenfalls ein Nomenpräfix, um Konflikte bei Befehlsnamen zu vermeiden, wenn der Workflow in eine Sitzung importiert wird.

Namen für Parameter und Variablen in Workflows dürfen nur Buchstaben, Zahlen sowie den Bindestrich (-) und den Unterstrich (_) enthalten. Vermeiden Sie die Verwendung des Bindestrichs in Parameternamen, da jede Verwendung von Parameternamen mit Bindestrich im Workflow und in Aufrufen an den Workflow in Klammern eingeschlossen werden müssen. Verwenden Sie keine Namen von workflow common parameters, Workflowlaufzeitvariablen oder andere reservierte Wörter wie „workflow“ und „parallel“.

Weitere Informationen zu Workflowlaufzeitparametern finden Sie in der MSDN Library im Hilfethema PSWorkflowRuntimeVariable Enumeration.

Weitere Informationen zu reservierten Wörtern finden Sie unter Syntaktische Unterschiede zwischen Skriptworkflows und Skripts und About_Reserved_Words.

So fügen Sie einem Workflow Parameter hinzu

Verwenden Sie zum Hinzufügen von Parametern das Schlüsselwort Param mit dem optionalen Parameter-Attribut. Sie verwenden hier dieselben Techniken wie beim Hinzufügen von Parametern zu einer Funktion.

Die folgenden Codeblöcke zeigen die Syntax des Schlüsselworts Param und des Parameter-Attributs in einem Skriptworkflow.

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

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

Sie können auch das CmdletBinding-Attribut verwenden, um das ConfirmImpact-Attribut, das DefaultParameterSetName-Attribut, das HelpUri-Attribut und das SupportsShouldProcess-Attribut anzugeben.

Der folgende Codeblock zeigt die Syntax eines Beispielworkflows, der das CmdletBinding-Attribut verwendet.

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

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

Sie müssen dem Workflow keine allgemeinen Workflowparameter hinzufügen.Windows PowerShell Workflow fügt die allgemeinen Parameter und allgemeinen Workflowparameter allen Workflows hinzu, einschließlich einfacher Workflows, die nicht über das CmdletBinding-Attribut oder das Parameter-Attribut verfügen.

Weitere Informationen zu Parametern in Funktionen und Workflows finden Sie in den folgenden Hilfethemen.

So fügen Sie einem Workflow Aktivitäten hinzu

Eine Aktivität ist die grundlegende Arbeitseinheit in einem Workflow. Jeder in einem Workflow verwendete Befehl und Ausdruck wird als Aktivität ausgeführt. In Windows PowerShell Workflow ähnelt eine Aktivität weitestgehend einem Cmdlet. Sie können eine Aktivität ausführen, indem Sie den Namen der Aktivität eingeben, gefolgt von den Parametern.Windows PowerShell Workflow konvertiert viele der in Windows PowerShell enthaltenen Cmdlets in Aktivitäten. Es gibt nur eine kleine Sammlung von ausgeschlossenen Cmdlets. Eine Liste der ausgeschlossenen Cmdlets finden Sie unter Verwenden von Aktivitäten in Skriptworkflows im Abschnitt „Excluded Cmdlets“ (Ausgeschlossene Cmdlets, in englischer Sprache).

Die meisten der Windows PowerShell-Kern-Cmdlets wurden als Aktivitäten implementiert. Geben Sie einfach den Namen oder den Alias der Cmdlets ein, um sie im Workflow zu verwenden.

Der folgende Workflow enthält beispielsweise die Get-Process-Aktivität.

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

Wenn ein Cmdlet nicht über eine entsprechende Aktivität verfügt und nicht ausdrücklich ausgeschlossen ist, führt Windows PowerShell Workflow das Cmdlet automatisch in der inlineScript-Aktivität aus und gibt die Ausgabe an den Workflow zurück.

Der folgende Workflow verwendet beispielsweise das Cmdlet Get-WindowsFeature, das implizit in einer inlineScript-Aktivität ausgeführt wird.

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

Sie können sogar Cmdlets ausführen, die ausgeschlossen sind, weil sie nicht als Aktivitäten implementiert sind. Sie müssen diese jedoch in einer inlineScript-Aktivität ausführen. Der folgende Workflow verwendet beispielsweise eine inlineScript-Aktivität zum Ausführen des ausgeschlossenen Cmdlets Get-Variable.

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

Sie können aus Ausdrücke in einem Workflow verwenden, darunter arithmetische Ausdrücke und Vergleichsanweisungen.Windows PowerShell Workflow führt Ausdrücke in einer speziellen Aktivität aus, die für diesen Zweck entwickelt wurde.

Der folgende Workflow enthält beispielsweise einen Ausdruck. Wie alle Ausdrücke wird er in einer Aktivität ausgeführt.

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

    320GB / 3MB
}

Weitere Informationen zu Aktivitäten finden Sie unter Verwenden von Aktivitäten in Skriptworkflows.

So verwenden Sie die Parameter von Aktivitäten

Aktivitäten sind wie Cmdlets Befehle mit Parametern. Wenn ein Cmdlet in eine Aktivität konvertiert wird, bleiben die Syntax und Parameter gleich. Es gibt wenige Ausnahmen, die im Hilfethema „Aktivitäten in Skriptworkflows“ aufgelistet sind.

Positionsparameter sind in Aktivitäten allerdings nicht gültig, sodass alle Parameternamen erforderlich sind. Parameteraliase und -abkürzungen sind erlaubt. Im folgenden Beispielworkflow werden beispielsweise die Name-Parameter der Cmdlets Get-Process, Get-WindowsFeature und Get-Variable in den Befehlen angezeigt.

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

Dynamische Parameter sind in Aktivitäten ebenfalls nicht gültig. Zum Aufrufen eines dynamischen Parameters schließen Sie den Befehl in eine InlineScript-Aktivität ein. Der folgende Workflow enthält beispielsweise eine inlineScript-Aktivität, die den dynamischen CodeSigningCert-Parameter des Cmdlets Get-ChildItem verwendet. Der CodeSigningCert-Parameter wird vom Certificate provider bereitgestellt und funktioniert nur im Laufwerk „Cert:“.

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

Weitere Informationen zur inlineScript-Aktivität finden Sie unter Ausführen von Windows PowerShell-Befehlen in einem Workflow.

So verwenden Sie allgemeine Aktivitätsparameter

Windows PowerShell Workflow fügt Aktivitäten eine Reihe allgemeiner Aktivitätsparameter hinzu. Mit diesen Parametern können Sie Optionen festlegen, die in einer Umgebung mit mehreren Computern wichtig sind.

Einige der allgemeinen Workflowparameter sind auch allgemeine Aktivitätsparameter. Mit diesem Feature können Sie aktivitätsspezifische Ausnahmen zu den Werten für die allgemeinen Workflowparameter hinzufügen. Sie können beispielsweise den PSComputerName-Parameter einer Aktivität verwenden, um eine Aktivität nur auf ausgewählten Computern auszuführen, oder eine Aktivität mit dem PSCredential-Parameter mit alternativen Anmeldeinformationen ausführen.

Die allgemeinen Aktivitätsparameter sind für die meisten, aber nicht alle, Aktivitäten gültig. Beispielsweise sind die allgemeinen Aktivitätsparameter nicht für die Suspend-Workflow-Aktivität und die Checkpoint-Workflow-Aktivität gültig. Die allgemeinen Aktivitätsparameter sind außerdem nicht für Cmdlets oder Ausdrücke verfügbar, die Windows PowerShell Workflow automatisch in einer Aktivität ausführt. Die allgemeinen Aktivitätsparameter sind für die InlineScript-Aktivität verfügbar, nicht aber für die Befehle im InlineScript-Skriptblock.

Die Aktivitäten im folgenden Workflow verwenden die allgemeinen Aktivitätsparameter, solange sie gültig sind.

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
}

Weitere Informationen zu allgemeinen Aktivitätsparametern finden Sie unter Verwenden von Aktivitäten in Skriptworkflows.

So rufen Sie Werte für allgemeine Parameter ab

Windows PowerShell Workflow fügt allen Workflows die Workflowlaufzeitvariablen hinzu. Die Workflowlaufzeitvariablen enthalten die Werte der allgemeinen Parameter und der allgemeinen Workflowparameter sowie andere Werte, die für die Workflows wichtig sind.

Die Variablenwerte sind äußerst nützlich. Nehmen Sie sich die Zeit, sie anzusehen und in Ihren Workflows zu verwenden. Wenn Sie beispielsweise einen Workflow ausführen, nimmt der PSComputerName-Parameter die Namen der Zielcomputer an, aber wenn Sie auf die $PSComputerName-Variable in einem Workflow zugreifen, enthält sie den Namen des Computers, auf dem der Workflow aktuell ausgeführt wird.

Weitere Informationen zu den Workflowlaufzeitvariablen finden Sie unter PSWorkflowRuntimeVariable Enumeration.

Verwenden Sie den Variablennamen, um von innerhalb des Workflows auf die Parameterwerte zuzugreifen. Sie müssen die Variable nicht definieren.

Der folgende Workflow verwendet beispielsweise den Wert des allgemeinen PSConnectionRetryCount-Parameters, indem er sich als $PSConnectionRetryCount-Variable darauf bezieht.

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

Im folgenden Beispiel wird gezeigt, dass bei Verwendung des PSConnectionRetryCount-Parameters für die Ausführung des Workflows der Parameterwert im Workflow sichtbar ist.

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

Wenn Sie die Werte für die Laufzeit und die allgemeinen Parameter in einem Workflow ändern möchten, verwenden Sie die Set-PSWorkflowData-Aktivität.

Der folgende Workflow enthält beispielsweise einen Befehl, der den Wert PSConnectionRetryCount ändert.

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.

Weitere Informationen zu Variablen in Windows PowerShell Workflow finden Sie in den folgenden Hilfethemen.

So rufen Sie Werte für Laufzeitvariablen und allgemeine Parameter ab

Windows PowerShell Workflow fügt allen Workflows die Workflowlaufzeitvariablen hinzu. Die Workflowlaufzeitvariablen enthalten die Werte der allgemeinen Parameter und der allgemeinen Workflowparameter sowie andere Werte, die für die Workflows wichtig sind.

Die Variablenwerte sind äußerst nützlich. Nehmen Sie sich die Zeit, sie anzusehen und in Ihren Workflows zu verwenden. Wenn Sie beispielsweise einen Workflow ausführen, nimmt der PSComputerName-Parameter die Namen der Zielcomputer an, aber wenn Sie auf die $PSComputerName-Variable in einem Workflow zugreifen, enthält sie den Namen des Computers, auf dem der Workflow aktuell ausgeführt wird.

Weitere Informationen zu den Workflowlaufzeitvariablen finden Sie unter PSWorkflowRuntimeVariable Enumeration.

Verwenden Sie den Variablennamen, um von innerhalb des Workflows auf die Parameterwerte zuzugreifen. Sie müssen die Variable nicht definieren.

Der folgende Workflow verwendet beispielsweise den Wert des allgemeinen PSConnectionRetryCount-Parameters, indem er sich als $PSConnectionRetryCount-Variable darauf bezieht.

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

Im folgenden Beispiel wird gezeigt, dass bei Verwendung des PSConnectionRetryCount-Parameters für die Ausführung des Workflows der Parameterwert im Workflow sichtbar ist.

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

Wenn Sie die Werte für die Laufzeit und die allgemeinen Parameter in einem Workflow ändern möchten, verwenden Sie die Set-PSWorkflowData-Aktivität.

Der folgende Workflow enthält beispielsweise einen Befehl, der den Wert PSConnectionRetryCount ändert.

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.

Weitere Informationen zu Variablen in Windows PowerShell Workflow finden Sie in den folgenden Hilfethemen.

So führen Sie ein Skript in einem Workflow aus

Schließen Sie zum Ausführen eines Skripts (PS1-Datei) in einem Workflow den Aufruf des Skripts in eine InlineScript-Aktivität ein. Wie andere Befehle und Aktivitäten wird das Skript auf allen Workflowzielcomputern ausgeführt und die Ausgabe an den Workflow zurückgegeben.

Der folgende Workflow enthält beispielsweise eine InlineScript-Aktivität, die ein Skript ausführt. Das Skript ist in einem freigegebenen Verzeichnis gespeichert. Der Workflow verwendet den PSPersist-Aktivitätsparameter, um einen Prüfpunkt aufzunehmen, wenn das Skript abgeschlossen wird.

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

Da Workflows auf eine Ausführung auf mehreren Computern ausgelegt sind, verwenden Sie einen absoluten, statt einen relativen Pfad zur Skriptdatei.

So führen Sie Befehle parallel aus

Die Schlüsselwörter Parallel und ForEach -Parallel optimieren Ihren Workflow, indem sie Befehle gleichzeitig und in einer unbestimmten Reihenfolge ausführen. Das Schlüsselwort Sequence führt ausgewählte Befehle nacheinander in einem Parallel-Skriptblock aus. Diese Schlüsselwörter sind nur in einem Workflow gültig. Sie sind in geschachtelten Workflows gültig, aber nicht in geschachtelten Funktionen in einem Workflow. Standardmäßig werden Befehle nacheinander ausgeführt. Dabei wird jeder Befehl abgeschlossen, bevor der nächste beginnt.

Da eine parallele Ausführung deutliche Leistungsverbesserungen bieten kann, insbesondere wenn der Workflow auf zahlreichen Computer ausgeführt werden soll, sollten Sie wann immer möglich die parallele Ausführung verwenden.

Die folgenden Arten von Befehlen und Aktivitäten eignen sich gut für eine parallele Ausführung.

  • Befehle, die keine Daten gemeinsam verwenden, z. B. Get-Process und Get-Service.

  • Befehle, die in einer Auflistung ähnlicher Elemente ausgeführt werden. Die meisten ForEach-Anweisungen eignen sich gut für die ForEach -Parallel-Ausführung.

Parallel

Die Befehle in einem Parallel-Skriptblock können gleichzeitig ausgeführt werden. Die Reihenfolge, in der sie ausgeführt werden, ist nicht festgelegt.

Das folgende Diagramm zeigt die Syntax eines Workflows mit dem Schlüsselwort Parallel und dem entsprechenden Skriptblock.

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

Der folgende Workflow enthält beispielsweise einen Parallel-Skriptblock, der Aktivitäten ausführt, die Prozesse und Dienste auf dem Computer abrufen. Da die Aufrufe an Get-Process und Get-Service unabhängig sind, können sie gleichzeitig und in beliebiger Reihenfolge ausgeführt werden.

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

ForEach -Parallel

Der Parallel-Parameter des Schlüsselworts ForEach führt die Befehle in einem ForEach-Skriptblock einmal für jedes Element in der angegebenen Sammlung aus. Die Elemente in der Auflistung werden parallel verarbeitet. Die Befehle im Skriptblock werden nacheinander ausgeführt.

Wie bei der ForEach-Anweisung in Windows PowerShell muss die Variable, die die Auflistung enthält ($<Collection>), vor der ForEach -Parallel-Anweisung definiert werden. Dagegen wird die Variable, die das aktuelle Element darstellt ($<item>), in der ForEach -Parallel-Anweisung definiert.

Im folgenden Diagramm ist die Befehlssyntax dargestellt.

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

Der folgende Workflow enthält beispielsweise eine Foreach -Parallel-Anweisung, mit der die Datenträger verarbeitet werden, die die Get-Disk-Aktivität abruft. Die Befehle im Skriptblock werden nacheinander ausgeführt, auf den Datenträgern werden sie jedoch parallel ausgeführt.

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

Sequence

Das Schlüsselwort Sequence führt Befehle nacheinander in einem Parallel-Skriptblock aus. Der Sequence-Skriptblock wird parallel mit anderen Befehlen ausgeführt, aber die Befehle im Sequence-Skriptblock werden nacheinander und in der angegebenen Reihenfolge ausgeführt.

Der folgende Codeblock zeigt die Syntax eines Sequence-Skriptblocks. Aktivität 3 wird möglicherweise vor oder zur selben Zeit wie Aktivität 1 und Aktivität 2 ausgeführt, aber Aktivität 4 wird erst ausgeführt, wenn Aktivität 3 abgeschlossen ist.

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

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