Variable de portée en PowerShell
Une chose triste, PowerShell, c'est que la fonction et scriptblocks dynamique étendue.
Mais il y a autre chose qui m'a surpris est que les variables se comportent comme une copie sur écriture à l'intérieur d'un intérieur de la portée.
$array=@("g")
function foo()
{
$array += "h"
Write-Host $array
}
& {
$array +="s"
Write-Host $array
}
foo
Write-Host $array
La sortie est:
g s
g h
g
Qui rend la dynamique de cadrage un peu moins douloureux. Mais comment puis-je éviter la copie sur écriture?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser champ d'application des modificateurs ou la
*-Variable
applets de commande.Le champ d'application des modificateurs sont:
global
utilisé pour accéder/modifier à l'extérieur de la portée (par exemple. le shell interactif)script
utilisé sur l'accès/modifier le champ d'application de l'exécution de script (.ps1
fichier). Si pas de l'exécution d'un script fonctionne alors commeglobal
.(Pour le
-Scope
paramètre de la*-Variable
applets de commande, consultez l'aide.)Par exemple. dans ton deuxième exemple, pour modifier directement le mondial
$array
:Pour plus de détails, voir la rubrique d'aide de about_scopes.
Le PowerShell étendues de l'article (about_Scopes) c'est sympa, mais trop verbeux, donc, c'est la citation de mon l'article:
En général, PowerShell étendues sont comme .NET étendues. Ils sont:
Ici est simple exemple, qui décrit l'utilisation et les effets de périmètres:
Comme vous pouvez le voir, vous pouvez utiliser $Global:essai de syntaxe qu'avec nommée étendues, $0:test sera toujours $null.
Pas seulement varibles. Lorsque l'on dit "élément", cela signifie que les variables, les fonctions, les alias, et psdrives. Tous ceux qui l'ont portée.
La copie sur écriture problème que vous voyez est en raison de la façon Powershell poignées de tableaux. Ajouter à la pile effectivement détruit le tableau d'origine et en crée une nouvelle. Depuis qu'il a été créé dans ce champ d'activité, il est détruit lorsque la fonction ou le bloc de script s'arrête et le champ d'application est éliminé.
Vous pouvez explicitement la portée varibles lorsque vous mettez à jour, ou vous pouvez utiliser [ref] les objets à faire vos mises à jour, ou écrire votre script de sorte que vous mettez à jour une propriété d'un objet ou d'une table de hachage de la clé d'un objet ou d'une table de hachage dans un parent. Ce n'est pas de créer un nouvel objet dans la portée locale, il modifie l'objet de la portée parent.