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.
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:
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:
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.
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')
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
$ 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:
Le même fichier d'aide est également disponible sur TechNet
Crédit d'image de portée: spadassin sur openclipart
Comment diffuser des jeux depuis votre PlayStation 4 vers n'importe quel appareil Android
Tout comme le streaming Xbox-PC de Microsoft, PlayStation 4 de Sony peut diffuser des jeux sur certains smartphones et tablettes Sony Xperia. Cependant, avec un petit tweak, vous pouvez diffuser vos jeux PlayStation 4 sur presque tous les appareils Android. Première étape: Installer l'application de lecture à distance modifiée Sony propose une application Play à distance PS4 sur Google Play, mais seulement officiellement compatible avec certains appareils Xperia Malgré cela, il peut effectivement fonctionner sur une plus grande variété d'appareils Android - Sony veut juste l'utiliser pour pousser ses propres téléphones et tablettes Xperia.
Qu'est-ce que Windows RT, et en quoi est-il différent de Windows 8?
Windows RT est une édition spéciale de Windows 8. Il fonctionne sur ARM et vous le trouverez aux côtés des machines Intel x86 dans les magasins, mais vous serez surpris à quel point Windows RT diffère de Windows vous savez. Windows RT est si différent que Microsoft a dit à Mozilla Windows RT "n'est plus Windows.