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