phhsnews.com


phhsnews.com / Comment les étendues affectent les scripts PowerShell

Comment les étendues affectent les scripts PowerShell


Dans les scripts batch, les modifications apportées aux variables d'environnement ont un impact global sur la session en cours par défaut. Pour PowerShell, le contraire est vrai car les étendues sont utilisées pour isoler les modifications d'un script. Ici, nous allons explorer comment les étendues affectent les scripts PowerShell et comment travailler dans et autour d'eux.

Qu'est-ce qu'un Scope?

Dans PowerShell, un "scope" fait référence à l'environnement actuel dans lequel un script ou shell de commande fonctionne. Les étendues sont utilisées pour protéger certains objets dans l'environnement contre une modification involontaire par des scripts ou des fonctions. En particulier, les éléments suivants sont protégés contre toute modification par des commandes exécutées depuis une autre portée, sauf indication contraire des paramètres de ces commandes:

  • Variables
  • Alias ​​
  • Fonctions
  • Lecteurs PowerShell (PSDrives)

Nouvelles portées sont créés chaque fois que vous exécutez un script ou une fonction, ou lorsque vous créez une nouvelle session ou une nouvelle instance de PowerShell. Les étendues créées en exécutant des scripts et des fonctions ont une relation "parent / enfant" avec la portée à partir de laquelle elles ont été créées. Certaines portées ont des significations particulièrement spéciales et sont accessibles par leur nom:

  • L'étendue Global est la portée créée au démarrage de PowerShell. Il inclut les variables, les alias, les fonctions et les PSDrives intégrés à PowerShell ainsi que tous ceux qui sont créés par votre profil PowerShell
  • L'étendue Local fait référence à la portée actuelle. Lorsque vous démarrez PowerShell, il se réfère à la portée globale, dans un script il s'agira de la portée Script, etc.
  • L'étendue Script est créée lors de l'exécution d'un script. Les seules commandes qui fonctionnent dans cette portée sont celles qui sont dans le script.
  • Les étendues privées peuvent être définies dans la portée actuelle, pour empêcher les commandes d'autres étendues de pouvoir lire ou modifier les éléments qu'elles pourraient avoir access to.

Les étendues peuvent également être référencées par nombre dans certaines commandes, où la portée actuelle est appelée zéro et ses ancêtres sont référencés par des nombres entiers croissants. Par exemple, dans un script exécuté à partir de la portée globale, la portée Script serait 0 et la portée globale serait 1. Une portée qui était ensuite imbriquée dans la portée Script, telle qu'une fonction, se référerait à la portée globale comme 2 Les nombres négatifs ne fonctionneront pas pour référencer les portées enfants - la raison en sera très bientôt.

Comment les portées affectent les commandes

Comme mentionné précédemment, les commandes exécutées dans une portée n'affectent pas les objets d'une autre portée faire cela. Par exemple, si $ MyVar existe dans la portée globale et qu'un script exécute une commande pour définir $ MyVar à une valeur différente, la version globale de $ MyVar reste inchangée tandis qu'une copie de $ MyVar est placée dans la portée Script avec la nouvelle valeur. Si $ MyVar n'existe pas, un script le créera par défaut dans la portée Script - et non dans la portée Global. Il est important de s'en souvenir lorsque vous découvrez la relation parent / enfant réelle entre les étendues.

La relation parent / enfant des étendues dans PowerShell est unidirectionnelle. Les commandes peuvent voir, et éventuellement modifier, la portée actuelle, son parent et toutes les étendues au-dessus. Cependant, ils ne peuvent pas voir ou modifier des choses dans les enfants de la portée actuelle. C'est principalement parce que, une fois que vous avez déplacé dans une portée parent, la portée de l'enfant a déjà été détruite parce qu'elle a rempli son objectif. Par exemple, pourquoi auriez-vous besoin de voir ou de modifier une variable dans la portée du script, à partir de la portée globale, après la fin du script? Il existe de nombreux cas où les modifications d'un script ou d'une fonction doivent persister au-delà de sa fin, mais pas si vous devez apporter des modifications aux objets dans la portée du script ou de la fonction avant ou après son exécution. (Habituellement, de telles choses seront traitées dans le cadre du script ou de la fonction elle-même de toute façon.)

Bien sûr, quelles sont les règles sans exceptions? Une exception à ce qui précède sont les étendues privées. Les objets dans les étendues privées sont uniquement accessibles aux commandes exécutées dans la portée à partir de laquelle elles ont été créées. Une autre exception importante est les articles qui ont la propriété AllScope. Ce sont des variables et des alias spéciaux pour lesquels une modification de portée affectera toutes les étendues. Les commandes suivantes vous montreront quelles variables et alias ont la propriété AllScope:

Get-Variable | Where-Object {$ _. Options -match 'AllScope'} Obtenir-Alias ​​| Where-Object {$ _. Options -match 'AllScope')

Portées en action

Pour commencer notre première exploration des portées, nous allons commencer dans une session PowerShell où la variable $ MyVar a été définie à une chaîne, 'Je suis une variable globale!', à partir de la ligne de commande. Ensuite, le script suivant sera exécuté à partir d'un fichier appelé Scope-Demo.ps1:

Function FunctionScope {'Modification de $ MyVar avec une fonction.' $ MyVar = 'J'ai été défini par une fonction!' "MyVar dit $ MyVar"} "Vérification de la valeur actuelle de $ MyVar." "MyVar dit $ MyVar" "Changer $ MyVar par script." $ MyVar = 'J'ai été fixé par un script!' "MyVar dit $ MyVar" "FunctionScope" Vérification de la valeur finale de MyVar avant la sortie du script. ' "MyVar dit $ MyVar" "

Si les scripts PowerShell fonctionnaient de la même manière que les scripts batch, nous nous attendrions à ce que la variable $ MyVar (ou% MyVar% en batch) change de 'Je suis une variable globale!', à 'Je me suis mis par un script!', et enfin à 'Je me suis mis en fonction d'une fonction!' où il resterait jusqu'à ce qu'il soit explicitement changé à nouveau ou la session est terminée.Toutefois, voyez ce qui se passe réellement ici lorsque nous nous déplaçons dans chacun des champs - en particulier, après que la fonction FunctionScope a terminé son travail et que nous vérifions à nouveau la variable Comme vous pouvez le voir, la variable a semblé changer au fur et à mesure que nous avancions dans le script, car jusqu'à la fin de la fonction FunctionScope, nous vérifiions la variable depuis la même portée que la dernière fois. Une fois que FunctionScope a été fait, nous sommes retournés dans la portée du script où $ MyVar n'a pas été touché par la fonction, puis, lorsque le script s'est terminé, nous sommes revenus dans la portée globale où elle n'avait pas été modifiée.

Atteindre la portée locale

Donc, tout cela est bien pour vous aider à éviter d'appliquer accidentellement des changements à l'environnement au-delà de vos scripts et de vos fonctions, mais que se passe-t-il si vous voulez ations? Il existe une syntaxe spéciale et assez simple pour créer et modifier des objets au-delà de la portée locale. Vous venez de mettre le nom de la portée au début du nom de la variable, et mettez un signe deux-points entre les noms de portée et de variable. Comme ceci:

$ global: MyVar $ script: MyVar $ local: MyVar

Vous pouvez utiliser ces modificateurs à la fois pour afficher et définir des variables. Voyons ce qui se passe avec ce script de démonstration:

Fonction FunctionScope {"Changer $ MyVar dans la portée de la fonction locale ... '$ local: MyVar =" Ceci est MyVar dans la portée locale de la fonction.' '$ MyVar dans la portée du script ... '$ script: MyVar =' MyVar a été défini par un script, maintenant défini par une fonction. 'Modification de $ MyVar dans la portée globale ...' $ global: MyVar = 'MyVar a été défini dans la portée globale. Maintenant défini par une fonction. "Cocher $ MyVar dans chaque étendue ..." "Local: $ local: MyVar" "Script: $ script: MyVar" "Global: $ global: MyVar" "}" Récupérer la valeur actuelle de $ MyVar. " "MyVar dit $ MyVar" "Changer $ MyVar par script." $ MyVar = 'J'ai été fixé par un script!' "MyVar dit $ MyVar" FunctionScope "Vérification $ MyVar de la portée du script avant de quitter. ' "MyVar dit $ MyVar" "

Comme précédemment, nous allons commencer par définir la variable dans la portée globale et terminer par vérifier le résultat de la portée globale finale.

Ici, vous pouvez voir que FunctionScope a pu changer la variable La modification de la variable dans la portée globale a persisté même après la fermeture du script, ce qui peut être particulièrement utile si vous devez modifier plusieurs fois les variables dans un script. , ou dans la portée globale, en utilisant le même code - vous définissez simplement une fonction ou un script qui est écrit pour modifier la variable où et comment vous avez besoin de faire, et appelez cela chaque fois que ces changements sont nécessaires. Les numéros de portée peuvent également être utilisés dans certaines commandes pour modifier la variable à différents niveaux par rapport à la portée locale Voici le même script utilisé dans le deuxième exemple ci-dessus, mais avec la fonction modifiée pour utiliser les commandes Get-Variable et Set-Variable avec numéro de portée bers au lieu de référencer directement la variable avec des étendues nommées:

FunctionScope {"Changer $ MyVar dans l'étendue 0, par rapport à FunctionScope ... 'Set-Variable MyVar" MyVar dans l'étendue 0 de la fonction. "-Scope 0' Changer $ MyVar dans scope 1, par rapport à FunctionScope ... 'Set-Variable MyVar 'MyVar a été modifié dans le scope 1, à partir d'une fonction.' -Scope 1 'Modification de $ MyVar dans la portée 2, par rapport à Functionscope ...' MyVar Set-Variable 'MyVar a été modifié dans la portée 2, à partir d'une fonction.' -Scope 2 "Cocher $ MyVar dans chaque portée ..." Portée 0: 'Obtenir-Variable MyVar -Scope 0 -ValueOnly' Portée 1: 'Obtenir-Variable MyVar -Scope 1 -ValueOnly' Portée 2: 'Get-Variable MyVar -Scope 2 -ValueOnly "}" Récupération de la valeur actuelle de $ MyVar. " "MyVar dit $ MyVar" "Changer $ MyVar par script." $ MyVar = 'J'ai été fixé par un script!' "MyVar dit $ MyVar" FunctionScope "Vérification $ MyVar de la portée du script avant de quitter. ' "MyVar says $ MyVar" "

Comme précédemment, nous pouvons voir ici comment les commandes d'une portée peuvent modifier les objets de sa portée parent.

Informations supplémentaires

Il reste encore beaucoup à faire avec les oscilloscopes Les étendues affectent plus que les variables, et il reste encore beaucoup à apprendre sur les étendues privées et les variables AllScope.Pour plus d'informations utiles, vous pouvez exécuter la commande suivante depuis PowerShell:

Get-Help about_scopes

Le même fichier d'aide est également disponible sur TechNet

Crédit d'image de portée: spadassin sur openclipart


Comment afficher l'icône

Comment afficher l'icône "Poste de travail" sur le bureau sous Windows 7, 8 ou 10

Je ne sais pas pour vous, mais j'ai vraiment préféré avoir l'icône Poste de travail sur le bureau. On dirait que les versions modernes de Windows ne l'ont plus par défaut. Vous pouvez ajouter l'icône de deux manières différentes. Sous Windows 10, l'icône Poste de travail s'appelle "Ce PC" et il est assez facile de le rajouter.

(how-to)

Comment définir Spotify comme votre fournisseur de musique par défaut sur Amazon Echo

Comment définir Spotify comme votre fournisseur de musique par défaut sur Amazon Echo

Jusqu'à maintenant, si vous vouliez jouer de la musique Spotify sur Amazon Echo, vous deviez dire l'artiste ou la chanson que vous voulait jouer et ensuite virer sur "sur Spotify" à la fin. C'est un peu encombrant, mais vous n'avez plus besoin de le faire car vous pouvez définir Spotify comme fournisseur de musique par défaut de votre Echo.

(how-to)