Écriture d'un workflow de script

 

S'applique à: Windows Server 2012, Windows Server 2012 R2

Les rubriques de cette section expliquent comment écrire un workflow dans le langage de script Windows PowerShell®, le langage que vous utilisez pour écrire des fonctions et des scripts dans Windows PowerShell. Vous pouvez exécuter les workflows que vous écrivez à la ligne de commande, les inclure dans des scripts et les inclure dans des modules de script.

Pour obtenir des informations sur l’écriture de workflows dans XAML, le langage natif de Windows Workflow Foundation,voir Écriture d’un workflow Windows PowerShell dans MSDN Library.

Planification d'un workflow

Un workflow Windows PowerShell est une solution efficace capable de rassembler des données à partir de centaines d’ordinateurs et d’apporter des modifications à ces ordinateurs chaque fois qu’il s’exécute. Planifiez la conception des workflows dans un souci de simplicité et d'efficacité. Gardez à l'esprit que le workflow peut se suspendre lui-même ou être suspendu par les utilisateurs, qu'il peut être contrôlé à partir de nombreuses sessions PowerShell qui se connectent à un processus côté serveur unique, qu'il peut survivre à des redémarrages, inclure des commandes et des fonctions qui s'exécutent en parallèle et que chaque commande exécute sa propre session.

Utilisez les recommandations de planification suivantes :

  • Si vous ne connaissez pas les workflows, consultez les rubriques de référence dans cette section, y compris Différences syntaxiques entre les workflows de script et les scripts.

  • Commencez par énumérer les tâches que le workflow effectuera. Marquez les sections qui peuvent s'exécuter simultanément ou qui n'ont pas besoin de s'exécuter dans un ordre prédéfini. Dans ces sections, marquez toutes celles qui s'exécutent dans un ordre séquentiel.

  • Organisez les tâches en fonctions au sein du workflow. Pour chaque tâche, utilisez une applet de commande Windows PowerShell existante ou créez une commande et ajoutez un point de contrôle après chaque étape critique.

  • Les workflows sont conçus pour s'exécuter sur plusieurs ordinateurs cibles. Vous n'avez pas besoin de créer de sessions distantes ni d'utiliser de commandes distantes, telles que celles qui utilisent l'applet de commande Invoke-Command, dans le workflow.

  • Comme avec n’importe quel script qui s’exécute sur plusieurs ordinateurs, tenez compte des variations entre les ordinateurs qui peuvent affecter le fonctionnement du script, y compris des différences de systèmes d’exploitation, de périphériques, d’organisation du système de fichiers, de variables d’environnement et de versions de Windows PowerShell.

  • Planifiez à l'avance les rubriques d'aide pour le workflow. Conservez un enregistrement des informations que vous devez communiquer aux utilisateurs, y compris une architecture de workflow préférée, ainsi que des autorisations et des caractéristiques de configuration de session préférées.

Pour écrire le workflow, utilisez un éditeur de script, tel que l’Environnement d’écriture de scripts intégré (ISE) de Windows PowerShell, qui impose la syntaxe du workflow et met en évidence les erreurs de syntaxe. Les différences syntaxiques entre les scripts et les workflows sont importantes, si bien qu'un outil qui connaît les workflows, ainsi que les scripts, vous permettra d'économiser beaucoup de temps pour le codage et les tests.

Pour plus d’informations sur les tâches adaptées aux workflows, voir « Différences entre les workflows et les scripts Windows PowerShell » dansPrésentation du workflow Windows PowerShell.

Mot clé Workflow

Commencez avec le mot clé workflow, qui identifie une commande de workflow pour Windows PowerShell. Le mot clé workflow est requis dans un workflow de script. Le nom du workflow suit le mot clé workflow. Le corps du workflow est placé entre accolades.

Le schéma syntaxique du mot clé Workflow est présenté ci-dessous.

workflow Test-Workflow
{
    ...
}

Pour plus d’informations sur les mots clés du langage de script Windows PowerShell, voir about_Language_Keywords.

Affectation de noms aux workflows et aux éléments de workflow

Un workflow est un type de commande Windows PowerShell. Sélectionnez un nom sous la forme verbe-nom. Utilisez l’applet de commande Get-Verb et la rubrique d’aide Verbes approuvés pour les commandes Windows PowerShell pour sélectionner un verbe approuvé pour le nom.Windows PowerShell génère un avertissement quand des commandes qui n’incluent pas des verbes approuvés sont importées à partir d’un module. Utilisez un nom descriptif et un préfixe, si nécessaire, pour empêcher des conflits entre les noms des commandes quand le workflow est importé dans une session.

Les noms des paramètres et les noms des variables dans les workflows peuvent inclure uniquement des lettres, des chiffres et les caractères trait d'union (-) et trait de soulignement (_). Évitez d'utiliser le trait d'union dans les noms des paramètres, car chaque fois qu'un nom de paramètre avec trait d'union apparaît dans le workflow et dans les appels au workflow, il faut placer le nom entre accolades. N’utilisez pas les noms des paramètres communs de workflow, des variables d’exécution de workflow ni d’autres mots réservés, tels que « workflow » et « parallel ».

Pour plus d’informations sur les paramètres d’exécution de workflow, voir la rubrique d’aide PSWorkflowRuntimeVariable Enumeration dans MSDN Library.

Pour plus d’informations sur les mots réservés,voir « Mots réservés dans les workflows » dans Différences syntaxiques entre les workflows de script et les scripts et about_Reserved_Words.

Comment ajouter des paramètres à un workflow

Pour ajouter des paramètres à un workflow, utilisez le mot clé Param avec l’attribut facultatif Parameter. Ce sont les mêmes techniques que vous utilisez pour ajouter des paramètres à une fonction.

Les blocs de code ci-dessous illustrent la syntaxe du mot clé Param et de l’attribut Parameter dans un workflow de script.

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

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

Vous pouvez également utiliser l’attribut CmdletBinding pour spécifier les attributs ConfirmImpact, DefaultParameterSetName, HelpUri et SupportsShouldProcess.

Le bloc de code suivant illustre la syntaxe d’un exemple de workflow qui utilise l’attribut CmdletBinding.

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

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

Vous n'avez pas besoin d'ajouter de paramètres communs de workflow au workflow. Le workflow Windows PowerShell ajoute les paramètres communs et les paramètres communs de workflow à tous les workflows, y compris les workflows simples qui ne possèdent pas l’attribut CmdletBinding ni l’attribut Parameter.

Pour plus d'informations sur les paramètres dans les fonctions et les workflows, reportez-vous aux rubriques d'aide ci-dessous.

Comment ajouter des activités à un workflow

Une activité représente l'unité élémentaire de travail dans un workflow. Chaque commande et chaque expression que vous utilisez dans un workflow s'exécute en tant qu'activité. Dans un workflow Windows PowerShell, une activité est très similaire à une applet de commande. Vous exécutez une activité en tapant son nom, suivi de ses paramètres. Le workflow Windows PowerShell convertit un grand nombre des applets de commande incluses dans Windows PowerShell en activités. Il n'existe qu'un ensemble réduit d'applets de commande exclus. Pour obtenir la liste des applets de commande exclues, voir « Applets de commande exclues » dans Utilisation d’activités dans les workflows de script.

La plupart des applets de commande centrales de Windows PowerShell ont été implémentées en tant qu’activités. Pour les utiliser dans un workflow, tapez simplement le nom de l'applet de commande ou son alias.

Par exemple, le workflow suivant inclut une activité Get-Process.

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

Quand une applet de commande n’a pas d’activité correspondante et n’est pas exclue explicitement, le workflow Windows PowerShell exécute automatiquement l’applet de commande dans l’activité inlineScript et renvoie le résultat au workflow.

Par exemple, le workflow suivant utilise l’applet de commande Get-WindowsFeature, qui s’exécute implicitement dans une activité inlineScript.

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

Vous pouvez même exécuter les applets de commande exclues, car elles ne sont pas implémentées en tant qu’activités, mais vous devez les exécuter dans une activité inlineScript. Par exemple, le workflow suivant utilise une activité inlineScript pour exécuter l’applet de commande Get-Variable qui est exclue.

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

Vous pouvez également utiliser des expressions dans un workflow, y compris des expressions arithmétiques et des instructions de comparaison. Le workflow Windows PowerShell exécute automatiquement les expressions dans une activité spéciale conçue dans cet objectif.

Par exemple, le workflow suivant inclut une expression. Comme toutes les expressions, il est exécuté dans une activité.

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

    320GB / 3MB
}

Pour plus d’informations sur les activités, voir Utilisation d’activités dans les workflows de script.

Comment utiliser les paramètres des activités

Les activités sont des commandes dotées de paramètres, tout comme les applets de commande. Quand un applet de commande est converti en activité, la syntaxe et les paramètres restent les mêmes. Il existe quelques exceptions, qui sont répertoriées dans la rubrique d'aide « Activités dans les workflows de script ».

Toutefois, les paramètres de position ne sont pas valides dans les activités, si bien que tous les noms de paramètres sont requis. Les alias et les abréviations de paramètres sont autorisés. Par exemple, dans l’exemple de workflow suivant, les paramètres Name des applets de commande Get-Process, Get-WindowsFeature et Get-Variable s’affichent dans les commandes.

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

Les paramètres dynamiques sont également non valides dans les activités. Pour appeler un paramètre dynamique, placez la commande dans une activité InlineScript. Par exemple, le workflow suivant inclut une activité inlineScript qui utilise le paramètre dynamique CodeSigningCert de l’applet de commande Get-ChildItem. Le paramètre CodeSigningCert est ajouté par le fournisseur de certificats et fonctionne uniquement dans le lecteur Cert:.

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

Pour plus d’informations sur l’activité inlineScript, voir Exécution de commandes Windows PowerShell dans un workflow.

Comment utiliser les paramètres communs d'activité

Le workflow Windows PowerShell ajoute un ensemble de paramètres communs d’activité aux activités. Ces paramètres vous permettent de définir des options critiques dans un environnement à plusieurs ordinateurs.

Certains des paramètres communs de workflow sont également des paramètres communs d'activité. Cette fonctionnalité vous permet de créer des exceptions spécifiques aux activités pour les valeurs des paramètres communs de workflow. Par exemple, vous pouvez utiliser le paramètre PSComputerName d’une activité pour exécuter une activité uniquement sur les ordinateurs sélectionnés, ou le paramètre PSCredential pour exécuter une activité avec d’autres informations d’identification.

Les paramètres communs d'activité sont valides sur la plupart des activités, mais pas sur toutes. Par exemple, les paramètres communs d’activité ne sont pas valides sur les activités Suspend-Workflow et Checkpoint-Workflow. De plus, ils ne sont pas disponibles sur les applets de commande ou les expressions que le workflow Windows PowerShell exécute automatiquement dans une activité. Les paramètres communs d’activités sont disponibles sur l’activité InlineScript, mais pas sur les commandes figurant dans le bloc de script InlineScript.

Les activités figurant dans le workflow suivant utilisent les paramètres communs d'activité dans la mesure où ils sont valides.

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
}

Pour plus d’informations sur les paramètres communs d’activité, voir Utilisation d’activités dans les workflows de script.

Comment obtenir les valeurs des paramètres communs

Le workflow Windows PowerShell ajoute les variables d’exécution de workflow à tous les workflows. Ces variables incluent les valeurs des paramètres communs, les paramètres communs de workflow et d'autres valeurs essentielles pour les workflows.

Les valeurs des variables sont extrêmement utiles. Prenez le temps de les passer en revue et utilisez-les dans vos workflows. Par exemple, quand vous exécutez un workflow, le paramètre PSComputerName prend les noms des ordinateurs cibles, mais quand vous accédez à la variable $PSComputerName dans un workflow, il contient le nom de l’ordinateur sur lequel le workflow est en cours d’exécution.

Pour plus d’informations sur les variables d’exécution de workflow, voir PSWorkflowRuntimeVariable Enumeration.

Pour accéder aux valeurs des paramètres au sein du workflow, utilisez le nom de la variable. Vous n'avez pas besoin de définir la variable.

Par exemple, le workflow suivant utilise la valeur du paramètre commun PSConnectionRetryCount en y faisant référence en tant que variable $PSConnectionRetryCount.

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

L’exemple suivant montre que si vous utilisez le paramètre PSConnectionRetryCount durant l’exécution du workflow, la valeur du paramètre est visible dans le workflow.

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

Pour modifier les valeurs des paramètres d’exécution et des paramètres communs dans un workflow, utilisez l’activité Set-PSWorkflowData.

Par exemple, le workflow suivant inclut une commande qui modifie la valeur PSConnectionRetryCount.

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.

Pour plus d’informations sur les variables dans un workflow Windows PowerShell, reportez-vous aux rubriques d’aide ci-dessous.

Comment obtenir les variables d'exécution et les valeurs des paramètres communs

Le workflow Windows PowerShell ajoute les variables d’exécution de workflow à tous les workflows. Ces variables incluent les valeurs des paramètres communs, les paramètres communs de workflow et d'autres valeurs essentielles pour les workflows.

Les valeurs des variables sont extrêmement utiles. Prenez le temps de les passer en revue et utilisez-les dans vos workflows. Par exemple, quand vous exécutez un workflow, le paramètre PSComputerName prend les noms des ordinateurs cibles, mais quand vous accédez à la variable $PSComputerName dans un workflow, il contient le nom de l’ordinateur sur lequel le workflow est en cours d’exécution.

Pour plus d’informations sur les variables d’exécution de workflow, voir PSWorkflowRuntimeVariable Enumeration.

Pour accéder aux valeurs des paramètres au sein du workflow, utilisez le nom de la variable. Vous n'avez pas besoin de définir la variable.

Par exemple, le workflow suivant utilise la valeur du paramètre commun PSConnectionRetryCount en y faisant référence en tant que variable $PSConnectionRetryCount.

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

L’exemple suivant montre que si vous utilisez le paramètre PSConnectionRetryCount durant l’exécution du workflow, la valeur du paramètre est visible dans le workflow.

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

Pour modifier les valeurs des paramètres d’exécution et des paramètres communs dans un workflow, utilisez l’activité Set-PSWorkflowData.

Par exemple, le workflow suivant inclut une commande qui modifie la valeur PSConnectionRetryCount.

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.

Pour plus d’informations sur les variables dans un workflow Windows PowerShell, reportez-vous aux rubriques d’aide ci-dessous.

Comment exécuter un script dans un workflow

Pour exécuter un script (fichier .ps1) dans un workflow, placez l’appel du script dans une activité InlineScript. Comme les autres commandes et activités, le script s'exécute sur tous les ordinateurs cibles du workflow et le résultat est renvoyé au workflow.

Par exemple, le workflow suivant inclut une activité InlineScript qui exécute un script. Ce script est stocké dans un répertoire partagé. Le workflow utilise le paramètre d'activité PSPersist pour prendre un point de contrôle quand le script se termine.

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

Comme les workflows sont conçus pour s'exécuter sur plusieurs ordinateurs, utilisez un chemin d'accès absolu vers le fichier de script, plutôt qu'un chemin d'accès relatif.

Comment exécuter des commandes en parallèle

Les mots clés Parallel et ForEach -Parallel optimisent votre workflow en exécutant des commandes simultanément et dans un ordre indéterminé. Le mot clé Sequence exécute les commandes sélectionnées de manière séquentielle dans un bloc de script Parallel. Ces mots clés sont valides uniquement dans un workflow. Ils sont valides dans des workflows imbriqués, mais non valides dans des fonctions imbriquées dans un workflow. Par défaut, les commandes s'exécutent de manière séquentielle et chaque commande se termine avant que la commande suivante commence.

Comme l'exécution en parallèle permet une amélioration significative des performances, notamment quand le workflow cible de nombreux ordinateurs, utilisez-la chaque fois que possible.

Les types de commandes et d'activités répertoriés ci-dessous sont de bons candidats pour l'exécution en parallèle.

  • Les commandes qui ne partagent pas de données, telles que Get-Process et Get-Service.

  • Les commandes qui s'exécutent sur une collection d'éléments semblables. La plupart des instructions ForEach sont de bonnes candidates pour l’exécution ForEach -Parallel.

Parallel

Les commandes figurant dans un bloc de script Parallel peuvent s’exécuter simultanément. L'ordre dans lequel elles s'exécutent n'est pas déterminé.

Le diagramme suivant illustre la syntaxe d’un workflow avec le bloc de script et le mot clé Parallel.

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

Par exemple, le workflow suivant inclut un bloc de script Parallel qui exécute des activités qui obtiennent des processus et des services sur l'ordinateur. Comme les appels à Get-Process et Get-Service sont indépendants, ils peuvent s'exécuter simultanément et dans un ordre quelconque.

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

ForEach -Parallel

Le paramètre Parallel du mot clé ForEach exécute les commandes dans un bloc de script ForEach une fois pour chaque élément de la collection spécifiée. Les éléments de la collection sont traités en parallèle. Les commandes figurant dans le bloc de script s'exécutent de manière séquentielle.

Comme pour l’instruction ForEach dans Windows PowerShell, la variable qui contient la collection ($<Collection>) doit être définie avant l’instruction ForEach -Parallel, mais la variable qui représente l’élément actuel ($<item) est définie dans l’instruction ForEach -Parallel.

Le diagramme suivant illustre la syntaxe de la commande.

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

Par exemple, le workflow suivant contient une instruction Foreach -Parallel qui traite les disques obtenus par l’activité Get-Disk. Les commandes figurant dans le bloc de script s'exécutent de manière séquentielle, mais elles sont exécutées sur les disques en parallèle.

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

Sequence

Le mot clé Sequence exécute les commandes de manière séquentielle dans un bloc de script Parallel. Le bloc de script Sequence s’exécute en parallèle avec d’autres commandes, mais les commandes incluses dans le bloc de script Sequence s’exécutent de manière séquentielle et dans l’ordre spécifié.

Le bloc de code ci-dessous illustre la syntaxe d’un bloc de script Sequence. L'activité 3 (Activity3) peut s'exécuter avant ou au même moment que l'activité 1 (Activity1) et l'activité 2 (Activity2), mais l'activité 4 (Activity4) ne s'exécutera qu'une fois que l'activité 3 sera terminée.

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

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