Partager via


À propos des oscilloscopes

Brève description

Explique le concept d’étendue dans PowerShell et montre comment définir et modifier l’étendue des éléments.

Description longue

PowerShell protège l’accès aux variables, alias, fonctions et lecteurs PowerShell (PSDrives) en limitant leur emplacement de lecture et de modification. PowerShell utilise des règles d’étendue pour s’assurer que vous ne modifiez pas par inadvertance un élément qui ne doit pas être modifié.

Voici les règles fondamentales du périmètre :

  • Les étendues peuvent être imbriquées. Une étendue externe est appelée étendue parente. Toutes les étendues imbriquées sont des étendues enfant de ce parent.

  • Un élément est visible dans l’étendue dans laquelle il a été créé et dans toutes les étendues enfants, sauf si vous le rendez explicitement privé. Vous pouvez placer des variables, des alias, des fonctions ou des lecteurs PowerShell dans une ou plusieurs étendues.

  • Un élément que vous avez créé dans une étendue ne peut être modifié que dans l’étendue dans laquelle elle a été créée, sauf si vous spécifiez explicitement une autre étendue.

Si vous créez un élément dans une étendue et que l’élément partage son nom avec un élément d’une autre étendue, l’élément d’origine peut être masqué sous le nouvel élément, mais il n’est pas remplacé ou modifié.

Étendues PowerShell

PowerShell prend en charge les étendues suivantes :

  • Global : étendue en vigueur au démarrage de PowerShell. Les variables et les fonctions présentes au démarrage de PowerShell ont été créées dans l’étendue globale, telles que les variables automatiques et les variables de préférence. Les variables, alias et fonctions de vos profils PowerShell sont également créées dans l’étendue globale.

  • Local : portée actuelle. L’étendue locale peut être l’étendue globale ou toute autre étendue.

  • Script : étendue créée lors de l’exécution d’un fichier de script. Seules les commandes du script s’exécutent dans la portée du script. Pour les commandes d’un script, la portée du script est la portée locale.

Remarque

Le privé n’est pas un champ d’application. Il s’agit d’une option qui modifie la visibilité d’un élément en dehors de la portée où l’élément est défini.

Étendues parent et enfant

Vous pouvez créer une étendue en exécutant un script ou une fonction, en créant une session ou en démarrant une nouvelle instance de PowerShell. Lorsque vous créez une étendue, le résultat est une étendue parent (l’étendue d’origine) et une étendue enfant (l’étendue que vous avez créée).

Dans PowerShell, toutes les étendues sont des étendues enfants de l’étendue globale, mais vous pouvez créer de nombreuses étendues et de nombreuses étendues récursives.

À moins que vous ne rendiez explicitement les éléments privés, les éléments de l'étendue parentale sont disponibles pour l'étendue enfant. Toutefois, les éléments que vous créez et modifiez dans l’étendue enfant n’affectent pas l’étendue parent, sauf si vous spécifiez explicitement l’étendue lorsque vous créez les éléments.

Héritage

Une étendue enfant n’hérite pas des variables, alias et fonctions de l’étendue parente. À moins qu’un élément ne soit privé, l’étendue enfant peut afficher les éléments de l’étendue parent. De plus, il peut modifier les éléments en spécifiant explicitement l’étendue parente, mais les éléments ne font pas partie de l’étendue enfant.

Toutefois, une étendue enfant est créée avec un ensemble d’éléments. En règle générale, il inclut tous les alias qui ont l’option AllScope . Cette option est abordée plus loin dans cet article. Il inclut toutes les variables qui ont l’option AllScope , ainsi que certaines variables automatiques.

Pour rechercher les éléments dans une étendue particulière, utilisez le paramètre Étendue de Get-Variable ou de Get-Alias.

Par exemple, pour obtenir toutes les variables dans l’étendue locale, tapez :

Get-Variable -Scope local

Pour obtenir toutes les variables dans l’étendue globale, tapez :

Get-Variable -Scope global

Modificateurs d’étendue

Un nom de variable, d’alias ou de fonction peut inclure l’un des modificateurs d’étendue facultatifs suivants :

  • global: : spécifie que le nom existe dans l’étendue globale .

  • local: : spécifie que le nom existe dans l’étendue locale. L’étendue actuelle est toujours l’étendue locale .

  • private: - Spécifie que le nom est privé et uniquement visible par l'étendue actuelle.

  • script: : spécifie que le nom existe dans l’étendue Script. L'étendue du script est l'étendue du fichier de script ancêtre le plus proche ou Global s'il n'y a pas de fichier de script ancêtre le plus proche.

  • using: - Utilisé pour accéder aux variables définies dans une autre portée lors de l’exécution de scripts via des applets de commande comme Start-Job et Invoke-Command.

  • workflow: : spécifie que le nom existe dans un flux de travail. Remarque : Les flux de travail ne sont pas pris en charge dans PowerShell Core.

  • <variable-namespace> - Un modificateur créé par un fournisseur PSDrive PowerShell. Par exemple:

    Namespace Descriptif
    Alias: Alias définis dans l'étendue courante
    Env: Variables d’environnement définies dans l’étendue actuelle
    Function: Fonctions définies dans l’étendue actuelle
    Variable: Variables définies dans l’étendue actuelle

L’étendue par défaut des scripts est l’étendue du script. L’étendue par défaut des fonctions et des alias est l’étendue locale, même s’ils sont définis dans un script.

Utilisation de modificateurs de portée

Pour spécifier l’étendue d’une nouvelle variable, d’un alias ou d’une fonction, utilisez un modificateur d’étendue.

La syntaxe d’un modificateur d’étendue dans une variable est la suivante :

$[<scope-modifier>:]<name> = <value>

La syntaxe d’un modificateur d’étendue dans une fonction est la suivante :

function [<scope-modifier>:]<name> {<function-body>}

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 l'étendue globale, utilisez le modificateur d'étendue global: :

$global:a = "one"

Pour créer la même variable dans l'étendue du script , utilisez le modificateur de portée script: :

$script:a = "one"

Vous pouvez également utiliser un modificateur d’étendue avec des fonctions. La définition de fonction suivante crée une fonction dans l’étendue globale :

function global:Hello {
  Write-Host "Hello, World"
}

Vous pouvez également utiliser des modificateurs d’étendue pour faire référence à une variable dans une autre étendue. La commande suivante fait référence à la variable $test, d’abord dans l’étendue locale, puis dans l’étendue globale :

$test
$global:test

Le modificateur d'étendue Using:

"Using" est un modificateur de portée spécial qui identifie une variable locale dans une commande distante. Sans modificateur, PowerShell s’attend à ce que les variables dans les commandes distantes soient définies dans la session distante.

Le modificateur Utilisation de l’étendue est introduit dans PowerShell 3.0.

Pour plus d'informations, voir about_Remote_Variables.

L'option AllScope

Les variables et les alias ont une propriété Option qui peut prendre la valeur AllScope. Les éléments qui ont la propriété AllScope font partie de toutes les étendues enfants que vous créez, bien qu’ils ne soient pas hérités rétroactivement par les étendues parentes.

Un élément qui a la propriété AllScope est visible dans l’étendue enfant et fait partie de cette étendue. Les modifications apportées à l’élément dans n’importe quelle étendue affectent toutes les étendues 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 étendue particulière. Utilisez la commande suivante pour rechercher toutes les applets de commande de votre session qui ont un paramètre Scope :

Get-Help * -Parameter scope

Pour rechercher les variables visibles dans une étendue particulière, utilisez le paramètre Scope de Get-Variable. Les variables visibles incluent des variables globales, des variables dans l’étendue parente et des variables dans l’étendue actuelle.

Par exemple, la commande suivante obtient les variables visibles dans l’étendue locale :

Get-Variable -Scope local

Pour créer une variable dans une étendue particulière, utilisez un modificateur d’étendue ou le paramètre Scope de Set-Variable. La commande suivante crée une variable dans l’étendue globale :

New-Variable -Scope global -Name a -Value "One"

Vous pouvez également utiliser le paramètre Scope des applets de commande New-Alias, Set-Aliasou Get-Alias pour spécifier l’étendue. La commande suivante crée un alias dans l’étendue globale :

New-Alias -Scope global -Name np -Value Notepad.exe

Pour obtenir les fonctions d'une étendue particulière, utilisez la cmdlet Get-Item lorsque vous vous trouvez dans cette étendue. L’applet Get-Item de commande n’a pas de paramètre Scope .

Remarque

Pour les applets de commande qui utilisent le paramètre Scope, vous pouvez également faire référence à des étendues par nombre. Le nombre décrit la position relative d’une étendue à une autre. L’étendue 0 représente l’étendue actuelle ou locale. Le périmètre 1 indique le périmètre parente immédiat. L'étendue 2 indique le parent de l'étendue parent, et ainsi de suite. Les étendues numérotées sont utiles si vous avez créé de nombreuses étendues récursives.

Utilisation de la notation de source de points avec la portée

Les scripts et les fonctions suivent toutes les règles de portée. Vous les créez dans une étendue particulière et elles affectent uniquement cette étendue, sauf si vous utilisez un paramètre d’applet de commande ou un modificateur d’étendue pour modifier cette étendue.

Toutefois, vous pouvez ajouter un script ou une fonction à l’étendue actuelle à l’aide de la notation de source de points. Ensuite, lorsqu’un script s’exécute dans l’étendue actuelle, toutes les fonctions, alias et variables créés par le script sont disponibles dans l’étendue actuelle.

Pour ajouter une fonction à l’étendue 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 (par défaut pour les scripts), utilisez la commande suivante :

c:\scripts\sample.ps1

Pour exécuter le script Sample.ps1 dans l’étendue 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

Vous pouvez en savoir plus sur l’opérateur d’appel dans about_operators.

Les alias, fonctions ou variables créés par le script Sample.ps1 ne sont pas disponibles dans l’étendue actuelle.

Restriction sans portée

Quelques concepts PowerShell sont similaires à l’étendue ou interagissent avec l’étendue. Ces concepts peuvent être confondus avec la portée ou le comportement de la portée.

Les sessions, les modules et les invites imbriquées sont des environnements autonomes, mais ils ne sont pas des étendues enfants de l’étendue globale de la session.

Séances

Une session est un environnement dans lequel PowerShell s’exécute. Lorsque vous créez une session sur un ordinateur distant, PowerShell établit une connexion persistante à l’ordinateur distant. La connexion persistante vous permet d’utiliser la session pour plusieurs commandes associées.

Étant donné qu’une session est un environnement confiné, elle a sa propre portée, mais une session n’est pas une étendue enfant de la session dans laquelle elle a été créée. La session commence avec sa propre étendue globale. Cette étendue est indépendante de l’étendue globale de la session. Vous pouvez créer des étendues enfant dans la session. Par exemple, vous pouvez exécuter un script pour créer une étendue enfant dans une session.

Modules

Vous pouvez utiliser un module PowerShell pour partager et fournir des outils PowerShell. Un module est une unité qui peut contenir des applets de commande, des scripts, des fonctions, des variables, des alias et d’autres éléments utiles. Sauf définition explicite, les éléments d’un module ne sont pas accessibles en dehors du module. Par conséquent, vous pouvez ajouter le module à votre session et utiliser les éléments publics sans vous soucier que les autres éléments peuvent remplacer les applets de commande, les scripts, les fonctions et d’autres éléments de 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. De plus, le module n’a pas sa propre portée, bien que les scripts du module, comme tous les scripts PowerShell, aient leur propre portée.

Par défaut, les modules sont chargés au niveau supérieur de l’état de la session en cours, et non dans la portée actuelle. Il peut s’agir d’un état de session de module ou de l’état de session global. Si vous êtes dans l’étendue globale, les modules sont chargés dans l’état de session globale. Toutes les exportations sont placées dans les tables globales. Si vous chargez module2 à partir de module1, module2 est chargé dans l’état de session de module1, et non dans l’état de session global. Toutes les exportations de module2 sont placées en haut de l’état de session de module1. Si vous utilisez Import-Module -Scope local, les exportations sont placées dans l’objet d’étendue actuel plutôt qu’au niveau supérieur. Si vous êtes dans un module et que vous utilisez Import-Module -Scope global (ou Import-Module -Global) pour charger un autre module, ce module et ses exportations sont chargés dans l’état de session global au lieu de l’état de session local du module. Cette fonctionnalité a été conçue pour l’écriture de modules qui manipulent des modules. Le module WindowsCompatibility permet d’importer des modules proxy dans l’étendue globale.

Invites imbriquées

De même, les invites imbriquées n’ont pas leur propre portée. Lorsque vous entrez une invite imbriquée, l’invite imbriquée est un sous-ensemble de l’environnement. Mais vous restez dans l'étendue locale.

Les scripts ont leur propre étendue. Si vous déboguez un script et que vous atteignez un point d'arrêt dans le script, vous entrez dans l'étendue du script.

Option privée

Les alias et les variables ont une propriété Option qui peut prendre la valeur Private. Les éléments qui ont l’option Privé peuvent être affichés et modifiés dans l’étendue dans laquelle ils ont été créés, mais ils ne peuvent pas être affichés ou modifiés en dehors de cette étendue.

Par exemple, si vous créez une variable qui a une option privée dans l’étendue globale, puis que vous exécutez un script, Get-Variable les commandes du script n’affichent pas la variable privée. L’utilisation du modificateur de portée globale dans ce cas n’affiche pas la variable privée.

Vous pouvez utiliser le paramètre Option des applets de New-Variablecommande , Set-Variable, New-Aliaset Set-Alias pour définir la valeur de la propriété Option sur Privé.

Visibilité

La propriété Visibility d’une variable ou d’un alias détermine si vous pouvez voir l’élément en dehors du conteneur, dans lequel il a été créé. Un conteneur peut être un module, un script ou un composant logiciel enfichable. La visibilité est conçue pour les conteneurs de la même manière que la valeur Private de la propriété Option est conçue pour les étendues.

La propriété Visibilité prend les valeurs Public et Privé . Les éléments qui ont une visibilité privée 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é, les éléments qui ont une visibilité privée ne peuvent pas être affichés ou modifiés.

La visibilité étant conçue pour les conteneurs, elle fonctionne différemment dans une étendue.

  • Si vous créez un élément qui dispose d’une visibilité privée dans l’étendue globale, vous ne pouvez pas afficher ou modifier l’élément dans aucune étendue.
  • Si vous essayez d’afficher ou de modifier la valeur d’une variable ayant une visibilité privée, PowerShell retourne un message d’erreur.

Vous pouvez utiliser les applets de commande New-Variable et Set-Variable pour créer une variable qui a une visibilité privée.

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.

Tout d’abord, pour afficher la valeur de la variable $ConfirmPreference dans l’étendue locale, utilisez la commande suivante :

PS>  $ConfirmPreference
High

Créez un script Scope.ps1 qui contient les commandes suivantes :

$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."

Exécutez le script. Le script modifie la valeur de la variable $ConfirmPreference, puis signale sa valeur dans l’étendue du script. La sortie doit ressembler à la sortie suivante :

The value of $ConfirmPreference is Low.

Ensuite, testez la valeur actuelle de la variable $ConfirmPreference dans l’étendue actuelle.

PS>  $ConfirmPreference
High

Cet exemple montre que les modifications apportées à la valeur d’une variable dans l’étendue du script n’affectent pas la valeur de la variable dans l’étendue parent.

Exemple 2 : Afficher une valeur de variable dans différentes étendues

Vous pouvez utiliser des modificateurs d’étendue pour afficher la valeur d’une variable dans l’étendue locale et dans une étendue parente.

Tout d’abord, définissez une variable $test dans l’étendue globale.

$test = "Global"

Ensuite, créez un script Sample.ps1 qui définit la variable $test. Dans le script, utilisez un modificateur d’étendue pour faire référence aux versions globales ou locales de la variable $test.

Dans Sample.ps1:

$test = "Local"
"The local value of `$test is $test."
"The global value of `$test is $global:test."

Lorsque vous exécutez Sample.ps1, la sortie doit ressembler à la sortie suivante :

The local value of $test is Local.
The global value of $test is Global.

Une fois le script terminé, seule la valeur globale de $test est définie dans la session.

PS>  $test
Global

Exemple 3 : Modifier la valeur d’une variable dans une étendue parent

À moins que vous ne protégiez un élément à l’aide de l’option Privé ou d’une autre méthode, vous pouvez afficher et modifier la valeur d’une variable dans une étendue parente.

Tout d’abord, définissez une variable $test dans l’étendue globale.

$test = "Global"

Ensuite, créez un script Sample.ps1 qui définit la variable $test. Dans le script, utilisez un modificateur d’étendue pour faire référence aux versions globales ou locales de la variable $test.

Dans Sample.ps1:

$global:test = "Local"
"The global value of `$test is $global:test."

Une fois le script terminé, la valeur globale de $test est modifiée.

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 l’étendue enfant, mais elles ne peuvent être affichées ou modifiées que dans l’étendue dans laquelle elles ont été créées.

La commande suivante crée une variable privée appelé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 l’étendue locale.

PS>  $ptest
1

PS>  $ptest = 2
PS>  $ptest
2

Ensuite, créez un script Sample.ps1 qui contient les commandes suivantes. La commande tente d’afficher et de modifier la valeur de $ptest.

Dans Sample.ps1:

"The value of `$Ptest is $Ptest."
"The value of `$Ptest is $global:Ptest."

La $ptest variable n’est pas visible dans la portée du script, la sortie est vide.

"The value of $Ptest is ."
"The value of $Ptest is ."

Exemple 5 : Utilisation d’une variable locale dans une commande à distance

Pour les variables d’une commande distante créée dans la session locale, utilisez le modificateur d’étendue Using. PowerShell suppose que les variables dans les commandes distantes ont été créées dans la session distante.

La syntaxe est la suivante :

$Using:<VariableName>

Par exemple, les commandes suivantes créent une variable $Cred dans la session locale, puis utilisent la variable $Cred dans une commande distante :

$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}

L’étendue Utilisation a été introduite dans PowerShell 3.0. Dans PowerShell 2.0, pour indiquer qu’une variable a été créée dans la session locale, utilisez le format de commande suivant.

$Cred = Get-Credential
Invoke-Command $s {
  param($c)
  Remove-Item .\Test*.ps1 -Credential $c
} -ArgumentList $Cred

Voir aussi

about_Variables

about_Environment_Variables

about_Functions

à_propos_des_blocs_de_scripts