RUBRIQUE
about_Scopes
DESCRIPTION COURTE
Explique le concept de portée dans Windows PowerShell et indique
comment définir et modifier la portée des éléments.
DESCRIPTION LONGUE
Windows PowerShell protège l'accès aux variables, alias, fonctions et
lecteurs Windows PowerShell (PSDrives) en limitant les emplacements où
ils peuvent être lus et modifiés. En mettant en vigueur quelques règles
simples pour la portée, Windows PowerShell permet de mieux garantir
que vous ne changez pas par inadvertance un élément qui ne doit pas
l'être.
Les éléments suivants sont les règles de base de portée :
- Un élément que vous incluez dans une portée est visible
dans la portée dans laquelle il a été créé et dans toute
portée enfant, à moins de le marquer comme privé. Vous
pouvez placer des variables, alias, fonctions ou lecteurs
Windows PowerShell dans une ou plusieurs portées.
- Un élément que vous avez créé dans une portée peut être modifié
uniquement dans la portée dans laquelle il a été créé, à moins
d'indiquer une autre portée de façon explicite.
Si vous créez un élément dans une portée et qu'il porte le même
nom qu'un élément dans une portée différente, l'élément d'origine
peut être masqué sous le nouvel élément. Toutefois, il n'est pas
remplacé ni changé.
Portées Windows PowerShell
Les portées dans Windows PowerShell possèdent des noms et des
nombres. Les portées nommées spécifient une portée absolue.
Les nombres sont relatifs et reflètent la relation entre les portées.
Globale :
Portée qui est en vigueur au démarrage de Windows PowerShell. Les
variables et fonctions qui sont présentes au démarrage de Windows
PowerShell ont été créées dans la portée globale. Cela inclut des
variables automatiques et de préférence. Cela inclut également les
variables, alias et fonctions qui figurent dans vos profils Windows
PowerShell.
Locale :
Portée actuelle. La portée locale peut être la portée globale
ou toute autre portée.
Script :
Portée créée pendant l'exécution d'un fichier de script.
Seules les commandes du script sont exécutées dans la portée
du script. Pour les commandes dans un script, la portée du
script est la portée locale.
Privée :
Les éléments dans une portée privée ne peuvent pas être visualisés
en dehors de la portée actuelle. Vous pouvez utiliser une portée
privée pour créer une version privée d'un élément du même nom dans
une autre portée.
Portées numérotées :
Vous pouvez faire référence aux portées par leur nom ou par
un nombre qui décrit la position relative d'une portée par
rapport à une autre. La portée 0 représente la portée actuelle,
ou locale. La portée 1 indique la portée parente immédiate.
La portée 2 indique le parent de la portée parente, et ainsi
de suite. Les portées numérotées sont utiles si vous avez créé
de nombreuses portées récursives.
Portées parente et enfant
Vous pouvez créer une portée en exécutant un script ou une
fonction, en créant une session ou en démarrant une nouvelle
instance de Windows PowerShell. Lorsque vous créez une portée, le
résultat est une portée parente (portée d'origine) et une portée
enfant (portée que vous avez créée).
Dans Windows PowerShell, toutes les portées sont des portées
enfants de la portée globale, mais vous pouvez créer de
nombreuses portées et portées récursives.
À moins de marquer de façon explicite les éléments comme privés, les
éléments dans la portée parente sont à la disposition de la portée enfant.
Toutefois, les éléments qui vous créez et modifiez dans la portée enfant
n'affectent pas la portée parente, à moins de spécifier de façon
explicite la portée lorsque vous créez les éléments.
Héritage
Une portée enfant n'hérite pas des variables, alias et fonctions de la
portée parente. Sauf si un élément est privé, la portée enfant peut
afficher les éléments dans la portée parente. Par ailleurs, elle peut
modifier les éléments en spécifiant la portée parente de façon
explicite, mais les éléments ne font pas partie de la portée enfant.
Toutefois, une portée enfant est créée avec un ensemble d'éléments. En
général, elle inclut tous les alias avec l'option AllScope. Cette
option est traitée ultérieurement dans cette rubrique. Elle inclut
toutes les variables avec l'option AllScope, plus quelques variables
qui peuvent être utilisées pour personnaliser la portée, telle que
MaximumFunctionCount.
Pour rechercher les éléments dans une portée particulière, utilisez le
paramètre Scope de Get-Variable ou Get-Alias.
Par exemple, pour obtenir toutes les variables dans la portée
locale, tapez :
get-variable -scope local
Pour obtenir toutes les variables dans la portée globale, tapez :
get-variable -scope global
Modificateurs de portée
Pour spécifier la portée de nouveaux alias, variable ou fonction,
utilisez un modificateur de portée. Les valeurs valides d'un
modificateur sont Global et Script.
La syntaxe d'un modificateur de portée dans une variable est :
$[<scope-modifier>]:<name> = <value>
La syntaxe d'un modificateur de portée dans une fonction est :
function [<scope-modifier>]:<name> {<function-body>}
La portée par défaut pour les scripts est la portée du script.
La portée par défaut pour les fonctions et alias est la portée
locale, même si elles sont définies dans un script.
La commande suivante, qui n'utilise pas de modificateur de
portée, crée une variable dans la portée actuelle ou locale :
$a = "one"
Pour créer la même variable dans la portée globale, utilisez le
modificateur de portée Global :
$global:a = "one"
Pour créer la même variable dans la portée du script, utilisez le
modificateur de portée Script :
$script:a = "one"
Vous pouvez également utiliser un modificateur de portée dans les
fonctions. La définition de fonction suivante crée une fonction
dans la portée globale :
function global:Hello
{
write-host "Hello, World"
}
Vous pouvez également utiliser des modificateurs de portée pour faire
référence à une variable dans une portée différente. La commande
suivante fait référence à la variable $test, d'abord dans la portée
locale, puis dans la portée globale :
$test
$global:test
Option AllScope
Les variables et alias ont une propriété Option qui peut prendre
la valeur AllScope. Les éléments avec la propriété AllScope sont
intégrés à toute portée enfant que vous créez, même s'ils ne sont pas
hérités rétroactivement par les portées parentes.
Un élément avec la propriété AllScope est visible dans la portée
enfant et il fait partie de cette portée. Les modifications
apportées à l'élément dans toute portée affectent toutes les
portées dans lesquelles la variable est définie.
Gestion de la portée
Plusieurs applets de commande ont un paramètre Scope qui vous permet
d'obtenir ou de définir (créer et modifier) des éléments dans une portée
particulière. Utilisez la commande suivante pour rechercher toutes
les applets de commande dans votre session avec un paramètre Scope :
get-help * -parameter scope
Pour rechercher les variables qui sont visibles dans une portée
particulière, utilisez le paramètre Scope de Get-Variable. Les
paramètres visibles incluent les paramètres globaux, paramètres
dans la portée parente et paramètres dans la portée actuelle.
Par exemple, la commande suivante obtient les variables qui sont
visibles dans la portée locale :
get-variable -scope local
Pour créer une variable dans une portée particulière, utilisez un
modificateur de portée ou le paramètre Scope de Set-Variable.
La commande suivante crée une variable dans la portée globale :
new-variable -scope global -name a -value "One"
Vous pouvez également utiliser le paramètre Scope des applets de
commande New-Alias, Set-Alias ou Get-Alias pour spécifier la
portée. La commande suivante crée un alias dans la portée globale :
new-alias -scope global -name np -value Notepad.exe
Pour obtenir les fonctions dans une portée particulière, utilisez
l'applet de commande Get-Item lorsque vous vous trouvez dans la
portée. L'applet de commande Get-Item n'a pas de paramètre Scope.
Utilisation de la notation de source de type " dot source " avec la portée
Les scripts et fonctions suivent toutes les règles de portée.
Vous les créez dans une portée particulière et ils affectent
uniquement cette portée à moins que vous n'utilisiez un paramètre
d'applet de commande ou un modificateur de portée pour modifier
cette portée.
Cependant, vous pouvez ajouter un script ou une fonction à la portée
actuelle à l'aide de la notation de source de type " dot source ".
Ensuite, lorsqu'un script est exécuté dans la portée actuelle, les
fonctions, alias et variables que le script crée sont disponibles
dans la portée actuelle.
Pour ajouter une fonction à la portée actuelle, tapez un
point (.) et un espace avant le chemin d'accès et le nom de la
fonction dans l'appel de fonction.
Par exemple, pour exécuter le script Sample.ps1 à partir du répertoire
C:\Scripts dans la portée du script (valeur par défaut pour les scripts),
utilisez la commande suivante :
c:\scripts\sample.ps1
Pour exécuter le script Sample.ps1 dans la portée locale, utilisez la
commande suivante :
. c:\scripts.sample.ps1
Lorsque vous utilisez l'opérateur d'appel (&) pour exécuter une
fonction ou un script, il n'est pas ajouté à la portée actuelle.
L'exemple suivant utilise l'opérateur d'appel :
& c:\scripts.sample.ps1
Tous les alias, fonctions ou variables créés par le script
Sample.ps1 ne sont pas disponibles dans la portée actuelle.
Restriction sans portée
Quelques concepts Windows PowerShell sont semblables à la portée ou
interagissent avec la portée. Ces concepts peuvent être confondus
avec la portée ou son comportement.
Les sessions, modules et invites imbriquées sont des environnements
autonomes, mais pas des portées enfants de la portée globale dans la
session.
Sessions :
Une session est un environnement dans lequel Windows PowerShell
est exécuté. Lorsque vous créez une session sur un ordinateur distant,
Windows PowerShell établit une connexion permanente à l'ordinateur distant.
La connexion permanente vous permet d'utiliser la session pour plusieurs
commandes associées.
Étant donné qu'une session est un environnement contenu, elle a sa
propre portée, mais une session n'est pas une portée enfant de la
session dans laquelle elle a été créée. La session démarre avec sa
propre portée globale. Cette portée est indépendante de la portée
globale de la session. Vous pouvez créer des portées enfants dans
la session. Par exemple, vous pouvez exécuter un script pour créer
une portée enfant dans une session.
Modules :
Vous pouvez utiliser un module Windows PowerShell pour partager et
remettre des outils Windows PowerShell. Un module est une unité qui
peut contenir des applets de commande, scripts, fonctions, variables,
alias ainsi que d'autres éléments utiles. À moins de le définir de
façon explicite, les éléments dans un module ne sont pas accessibles à
l'extérieur du module. Par conséquent, vous pouvez ajouter le module
à votre session et utiliser les éléments publics sans craindre que
les autres éléments ne puissent remplacer les applets de commande,
scripts, fonctions et autres éléments dans votre session.
La confidentialité d'un module se comporte comme une portée, mais
l'ajout d'un module à une session ne modifie pas la portée. Par
ailleurs, le module n'a pas sa propre portée, bien que les scripts
dans le module, comme tous les scripts Windows PowerShell, aient
leur propre portée.
Invites imbriquées :
De la même façon, les invites imbriquées n'ont pas leur
propre portée. Lorsque vous entrez une invite imbriquée,
il s'agit d'un sous-ensemble de l'environnement. Cependant,
vous restez dans la portée locale.
Les scripts ont leur propre portée. Si vous déboguez un script et
atteignez un point d'arrêt dans le script, vous entrez la portée du
script.
Option Private :
Les alias et variables ont une propriété Option qui peut
prendre la valeur Private. Les éléments avec l'option Private
peuvent être affichés et modifiés dans la portée dans laquelle
ils sont créés, mais ils ne peuvent pas être affichés ni
modifiés à l'extérieur de cette portée.
Par exemple, si vous créez une variable qui a une option
Private dans la portée globale, puis exécutez un script, les
commandes Get-Variable du script n'affichent pas la variable
privée. Cela se produit même si vous utilisez le modificateur
de portée Global.
Vous pouvez utiliser le paramètre Option des applets de
commande New-Variable, Set-Variable, New-Alias et Set-Alias
pour affecter la valeur Private à la propriété Option.
Visibility :
La propriété Visibility d'une variable ou d'un alias
détermine si vous pouvez afficher l'élément à l'extérieur du
conteneur, tel qu'un module, dans lequel il a été créé. La
propriété Visibility est conçue pour les conteneurs de la
même façon que la valeur Private de la propriété Option est
conçue pour les portées.
La propriété Visibility accepte les valeurs Public et Private. Les
éléments dont la propriété Visibility a la valeur Private peuvent
être affichés et modifiés uniquement dans le conteneur dans lequel
ils ont été créés. Si le conteneur est ajouté ou importé, ces éléments
ne peuvent pas être affichés ni modifiés.
Étant donné que la propriété Visibility est conçue pour les
conteneurs, son fonctionnement est différent dans une portée.
Si vous créez un élément dont la propriété Visibility a la valeur
Private dans la portée globale, vous ne pouvez pas l'afficher ni le
modifier dans toute portée. Si vous essayez d'afficher ou de modifier
la valeur d'une variable dont la propriété Visibility a la valeur
Private, Windows PowerShell retourne un message d'erreur.
Vous pouvez utiliser les applets de commande New-Variable et
Set-Variable pour créer une variable dont la propriété Visibility
a la valeur Private.
EXEMPLES
Exemple 1 : Modifier la valeur d'une variable uniquement dans un Script
La commande suivante modifie la valeur de la variable
$ConfirmPreference dans un script. La modification n'affecte
pas la portée globale.
D'abord, pour afficher la valeur de la variable $ConfirmPreferen
ce dans la portée locale, utilisez la commande suivante :
C:\PS> $ConfirmPreference
High
Créez un script Scope.ps1 qui contient les commandes suivantes :
$ConfirmPreference = "Low"
"La valeur de `$ConfirmPreference est $ConfirmPreference."
Exécutez le script. Le script modifie la valeur de la variable
$ConfirmPreference, puis signale sa valeur dans la portée du script.
La sortie doit ressembler à la sortie suivante :
La valeur de $ConfirmPreference est Low.
Ensuite, testez la valeur actuelle de la variable
$ConfirmPreference dans la portée actuelle.
C:\PS> $ConfirmPreference
High
Cet exemple montre que les modifications apportées à la valeur d'une
variable dans la portée du script n'affectent pas la valeur de cette
variable dans la portée parente.
Exemple 2 : Afficher la valeur d'une variable dans des portées différentes
Vous pouvez utiliser des modificateurs de portée pour afficher
la valeur d'une variable dans la portée locale et dans une
portée parente.
En premier lieu, définissez une variable $test dans la portée
globale.
$test = "Global"
Ensuite, créez un script Sample.ps1 qui définit la variable
$test. Dans le script, utilisez un modificateur de portée pour faire
référence à la version globale ou locale de la variable $test.
# In Sample.ps1
$test = "Local"
"La valeur locale de `$test est $test."
"La valeur globale de `$test est $global:test."
Lorsque vous exécutez Sample.ps1, la sortie doit ressembler à
la sortie suivante :
La valeur locale de $test est Local.
La valeur globale de $test est Global.
Lorsque le script est terminé, seule la valeur globale de $test est
définie dans la session.
C:\PS> $test
Global
Exemple 3 : Modifier la valeur d'une variable dans une portée parente
À moins de protéger un élément à l'aide de l'option Private ou
d'une autre méthode, vous pouvez afficher et modifier la valeur
d'une variable dans une portée parente.
En premier lieu, définissez une variable $test dans la portée
globale.
$test = "Global"
Ensuite, créez un script Sample.ps1 qui définit la variable
$test. Dans le script, utilisez un modificateur de portée pour faire
référence à la version globale ou locale de la variable $test.
# In Sample.ps1
$global:test = "Local"
"La valeur globale de `$test est $global:test."
Lorsque le script est terminé, la valeur globale de $test est
modifiée.
C:\PS> $test
Local
Exemple 4 : Création d'une variable privée
Une variable privée est une variable dont la propriété Option a
la valeur Private. Les variables privées sont héritées par la portée
enfant, mais elles ne peuvent être affichées ou modifiées que dans la
portée dans laquelle elles ont été créées.
La commande suivante crée une variable privée nommée $ptest
dans la portée locale.
new-variable -name ptest -value 1 -option private
Vous pouvez afficher et modifier la valeur de $ptest dans la
portée locale.
C:\PS> $ptest
1
C:\PS> $ptest = 2
C:\PS> $ptest
2
Créez ensuite un script Sample.ps1 qui contient les commandes
suivantes.
La commande essaie d'afficher et de modifier la valeur de $ptest.
# In Sample.ps1
"La valeur de `$Ptest est $Ptest."
"La valeur de `$Ptest est $global:Ptest."
Étant donné que la variable $ptest n'est pas visible dans la
portée du script, la sortie est vide.
"La valeur de $Ptest est ."
"La valeur de $Ptest est ."
VOIR AUSSI
about_Variables
about_Environment_Variables
about_Functions
about_Script_Blocks