Partager via


about_Scopes

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