Partager via


about_Script_Blocks

Brève description

Définit ce qu’est un scriptblock et explique comment utiliser des blocs de script dans le langage de programmation PowerShell.

Description longue

Dans le langage de programmation PowerShell, un scriptblock est une collection d’instructions ou d’expressions qui peuvent être utilisées en tant qu’unité unique. La collection d’instructions peut être placée entre accolades ({}), définie en tant que fonction ou enregistrée dans un fichier de script. Un scriptblock peut retourner des valeurs et accepter des paramètres et des arguments. Les scriptsblocks créent une nouvelle étendue pour les variables.

Syntacticalement, un scriptblock est une liste d’instructions dans les accolades, comme illustré dans la syntaxe suivante :

{<statement list>}

Un scriptblock retourne la sortie de toutes les commandes dans le scriptblock, en tant qu’objet unique ou sous forme de tableau.

Vous pouvez également spécifier une valeur de retour à l’aide du return mot clé. Le return mot clé n’affecte pas ou ne supprime pas d’autres sorties retournées par votre scriptblock. Toutefois, le return mot clé quitte le scriptblock à cette ligne. Pour plus d’informations, consultez about_Return.

Comme les fonctions, un scriptblock peut inclure des paramètres. Utilisez le mot clé param pour affecter des paramètres nommés, comme indiqué dans la syntaxe suivante :

{
    param ([type]$Parameter1 [,[type]$Parameter2])
    <statement list>
}

Comme les fonctions, les scriptsblocks peuvent inclure l’instruction dynamicparam , et les begininstructions , processet end . Pour plus d’informations, consultez about_Functions et about_Functions_Advanced.

Important

Tous les blocs placés entre accolades ne sont pas des blocs de script. Par exemple, les commandes d’une for boucle ou d’une if instruction sont placées dans un bloc d’instructions. Les blocs d’instructions ne créent pas d’étendue pour les variables, prennent en charge les paramètres des autres mots clés d’instruction.

Utilisation de scriptsblocks

Un scriptblock est une instance d’un type System.Management.Automation.ScriptBlockMicrosoft .NET Framework. Les commandes peuvent avoir des valeurs de paramètre scriptblock. Par exemple, l’applet Invoke-Command de commande a un ScriptBlock paramètre qui prend une valeur de scriptblock, comme illustré dans cet exemple :

Invoke-Command -ScriptBlock { Get-Process }
Handles  NPM(K)    PM(K)     WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----     ----- -----   ------     -- -----------
999          28    39100     45020   262    15.88   1844 communicator
721          28    32696     36536   222    20.84   4028 explorer
...

Invoke-Command peut également exécuter des blocs de script qui ont des blocs de paramètres. Les paramètres sont attribués par position à l’aide du paramètre ArgumentList .

Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second

Le scriptblock dans l’exemple précédent utilise le param mot clé pour créer des paramètres $p1 et $p2. La chaîne « First » est liée au premier paramètre ($p1) et « Second » est lié à ($p2).

Pour plus d’informations sur le comportement d’ArgumentList, consultez about_Splatting.

Vous pouvez utiliser des variables pour stocker et exécuter des blocs de script. L’exemple ci-dessous stocke un scriptblock dans une variable et le transmet à Invoke-Command.

$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status   Name               DisplayName
------   ----               -----------
Running  BITS               Background Intelligent Transfer Ser...

L’opérateur d’appel est un autre moyen d’exécuter des blocs de script stockés dans une variable. Comme Invoke-Command, l’opérateur d’appel exécute le scriptblock dans une étendue enfant. L’opérateur d’appel peut faciliter l’utilisation des paramètres avec vos scriptsblocks.

$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First

Vous pouvez stocker la sortie de vos scriptsblocks dans une variable à l’aide de l’affectation.

PS>  $a = { 1 + 1}
PS>  $b = &$a
PS>  $b
2
PS>  $a = { 1 + 1}
PS>  $b = Invoke-Command $a
PS>  $b
2

Pour plus d’informations sur l’opérateur d’appel, consultez about_Operators.

Utilisation de scripts delay-bind avec des paramètres

Un paramètre typé qui accepte l’entrée de pipeline permet d’utiliser des blocs de script de liaison différée sur le paramètre. Vous pouvez utiliser des blocs de script de liaison différée comme raccourci pour définir des paramètres pour une applet de commande pipeline avant de l’exécuter.

Dans le scriptblock delay-bind, vous pouvez référencer le canal dans l’objet à l’aide de la variable $_de pipeline .

# Both examples rename config.log to old_config.log
# Without delay-binding
dir config.log | ForEach-Object -Process {
  Rename-Item -Path $_ -NewName "old_$($_.Name)"
}
# With delay-binding
dir config.log | Rename-Item -NewName { "old_$($_.Name)" }

Dans les applets de commande plus complexes, les blocs de script de liaison différé permettent la réutilisation d’un canal dans l’objet pour remplir d’autres paramètres.

Remarques sur les blocs de script delay-bind en tant que paramètres :

  • Vous devez spécifier explicitement les noms de paramètres que vous utilisez avec des blocs de script de liaison différée.

  • Le paramètre ne doit pas être non typé et le type du paramètre ne peut pas être [scriptblock] ou [Object].

  • Vous recevez une erreur si vous utilisez un scriptblock de liaison différée sans fournir d’entrée de pipeline.

    Rename-Item -NewName {$_.Name + ".old"}
    
    Rename-Item : Cannot evaluate parameter 'NewName' because its argument is
    specified as a scriptblock and there is no input. A scriptblock cannot
    be evaluated without input.
    At line:1 char:23
    +  Rename-Item -NewName {$_.Name + ".old"}
    +                       ~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : MetadataError: (:) [Rename-Item],
          ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoInput,
          Microsoft.PowerShell.Commands.RenameItemCommand
    

Voir aussi