Powershell gourous, veuillez préciser la portée des variables en fonction de
J'ai lu que les variables à l'intérieur de la portée d'une fonction sont accessibles dans le champ d'application actuel lorsque la fonction de script est le point d'origine.
Est-il vrai? C'est très étrange et inhabituel, je pense...
Pouvez me préciser les raisons de cette. Exemple, my-f
jeux de $my-f-var
à certaines entier, disons 2:
PS1> . .\my-f-script.ps1
PS1> my-f
PS1> $my-f-var
2
Je m'attends à ce que $my-f-var
n'est pas accessible, car à l'intérieur de la fonction! Est-il un moyen de faire des variables privées, ou une manière d'appeler la fonction sans dot-sourcing son script?
Vous devez vous connecter pour publier un commentaire.
Variables au sein de la fonction sont locales à cette étendue, à moins que vous point l'invocation du nom de la fonction. Lorsque vous dot source d'un script, le script de niveau supérieur variables sont effectivement importées dans le champ d'application actuel avec les définitions de fonction par exemple:
Notez que ${ma-f-var} n'est pas défini dans la portée locale. Cependant, si je " dot " l'invocation de la fonction de son contenu sont exécutés dans le champ d'application actuel par exemple:
Dans ce cas, la variable définie dans la fonction est définie dans le courant (l'invocation) champ d'application en raison de la " dot " utilisé pour l'appeler.
Un couple de points de plus: vous pouvez accéder à des variables à différents domaines en utilisant soit
Get-Variable -scope
ou le plus pratique (si moins souple) mondial, script, locales et privées des modificateurs. Lorsque vous accédez à une variable dans une fonction où la variable est définie dans une étendue supérieure, vous pouvez lire c'est très bien. Mais quand vous le mettez, PowerShell fait essentiellement une "copie à l'écriture" de la variable de la création d'une nouvelle copie de l'étendue de cette fonction vers le bas (c'est à dire pour les autres fonctions qu'il appelle). Si vous voulez vraiment modifier plus d'étendue variable, vous pouvez utiliser $global:Foo ou $script:Foo de modifier à ces étendues.La
local
champ d'application est très pratique si vous voulez éviter, par inadvertance, à l'aide d'une variable définie à l'extérieur de votre fonction. Un autre MVP apporté ce jusqu'à la dernière MVP summit, et il semble comme un de ces "meilleures pratiques" des conseils. Voici le scénario:Noter que dans ce cas l'utilisation de
$foo
à l'intérieur de la fonction est une faute de frappe mais comme par hasard il y a une variable par la faute de frappe avait nom. Ce n'était pas l'intention de la fonction et il ne fonctionne pas correctement bien qu'il est difficile de voir dans ce cas. Ci-dessous, nous pouvons utiliser lalocal
spécificateur assurez-vous que la fonction de recherche uniquement dans les locaux de la portée de la variable. Il ne le trouve pas en raison de la faute de frappe, mais au moins l'erreur est un peu plus facile à repérer maintenant.La
private
champ d'application est utile lorsque vous ne voulez pas que certaines variables soient visibles pour les autres fonctions de vos appels de fonction.man about_scopes
à partir de l'invite de PowerShell. Que serait un bon sujet d'aide à la lecture.Set-StrictMode -v latest
peut vous aider à éviter accidentellement en se référant à des variables de portée externe ...