about_Script_Blocks
Description courte
Définit ce qu’est un bloc de script et explique comment utiliser des blocs de script dans le langage de programmation PowerShell.
Description longue
Dans le langage de programmation PowerShell, un bloc de script est une collection d’instructions ou d’expressions qui peuvent être utilisées comme une seule unité. Un bloc de script peut accepter des arguments et retourner des valeurs.
D’un point de vue syntaxique, un bloc de script est une liste d’instructions en accolades, comme illustré dans la syntaxe suivante :
{<statement list>}
Un bloc de script retourne la sortie de toutes les commandes du bloc de script, sous la forme d’un objet unique ou d’un tableau.
Vous pouvez également spécifier une valeur de retour à l’aide de la return
mot clé. Le return
mot clé n’affecte pas ou ne supprime pas les autres sorties retournées à partir de votre bloc de script. Toutefois, le return
mot clé quitte le bloc de script sur cette ligne. Pour plus d’informations, consultez about_Return.
Comme les fonctions, un bloc de script 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>
}
Notes
Dans un bloc de script, contrairement à une fonction, vous ne pouvez pas spécifier de paramètres en dehors des accolades.
Comme les fonctions, les blocs de script peuvent inclure les DynamicParam
mots clés , Begin
, Process
et End
. Pour plus d’informations, consultez about_Functions et about_Functions_Advanced.
Utilisation de blocs de script
Un bloc de script est un instance d’un type System.Management.Automation.ScriptBlock
Microsoft .NET Framework . Les commandes peuvent avoir des valeurs de paramètre de bloc de script. Par exemple, l’applet de Invoke-Command
commande a un ScriptBlock
paramètre qui prend une valeur de bloc de script, 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 bloc de script de 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ée à ($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 bloc de script 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 une autre façon d’exécuter des blocs de script stockés dans une variable.
Comme Invoke-Command
, l’opérateur d’appel exécute le bloc de script dans une étendue enfant. L’opérateur d’appel peut faciliter l’utilisation des paramètres avec vos blocs de script.
$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First
Vous pouvez stocker la sortie de vos blocs de script 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 blocs de script delay-bind avec des paramètres
Un paramètre typé qui accepte l’entrée de pipeline (by Value
) ou (by PropertyName
) permet d’utiliser des blocs de script de liaison différée sur le paramètre.
Dans le bloc de script delay-bind , vous pouvez référencer le canal dans l’objet à l’aide de la variable $_
de pipeline .
# Renames config.log to old_config.log
dir config.log | Rename-Item -NewName {"old_" + $_.Name}
Dans les applets de commande plus complexes, les blocs de script delay-bind permettent la réutilisation d’un objet redirigé dans pour remplir d’autres paramètres.
Remarques sur les blocs de script delay-bind en tant que paramètres :
Vous devez spécifier explicitement tous 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 bloc de script 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 script block and there is no input. A script block 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