2014-06-26 28 views
9

Ich habe globale Variablen und möchte sie mit in einer Funktion verwenden.PowerShell Globale Variablen lokale Variablen

Ich verwende keine lokalen Variablen mit dem gleichen Namen innerhalb der Funktionen!

# global vars: 
$Var1 = @{ .. } 
$Var2 = @(..) 
function testing{ 
    $Var1.keyX = "kjhkjh" 
    $Var2[2] = 6.89768 
} 

ich es tun und es funktioniert, aber es ist sicher, oder muss ich verwenden:

$Global:Var1.keyX = "kjhkjh" 

Danke, Gooly

Antwort

20

In Ihrer Funktion Sie ändern die Inhalt der Hashtabelle, so dass $ global nicht benötigt wird, es sei denn, Ihre Funktion (oder ein Funktionsaufruf zwischen Ihrer Funktion und dem globalen Bereich) hat lokale Variablen $ Var1 und $ Var2 (BTW fehlt Ihnen nicht $). Wenn das alles dein eigener Code ist, würde ich sagen, lass es so wie es ist. Wenn Sie Code jedoch zulassen, dass Code anderer Personen Ihre Funktion aufruft, würde ich den Spezifizierer $global:Var1 verwenden, um sicherzustellen, dass Sie auf die globale Variable zugreifen und nicht unbeabsichtigt auf eine Variable desselben Namens innerhalb einer Funktion zugreifen, die Ihre Funktion aufruft .

andere Sache, über dynamischen Scoping in Powershell zu wissen, dass, wenn Sie einen Wert Variable in einer Funktion zuweisen und diese Variable geschieht ein globaler zB sein:

$someGlobal = 7 
function foo { $someGlobal = 42; $someGlobal } 
foo 
$someGlobal 

Powershell eine „Copy-on tun -write "Operation auf die Variable $ someGlobal innerhalb der Funktion. Wenn Ihre Absicht, die globale wirklich ändern war dann würden Sie die $global: Spezifizierer verwenden:

$someGlobal = 7 
function foo { $global:someGlobal = 42; $someGlobal } 
foo 
$someGlobal 
+1

Vielen Dank Keith (änderte ich meine Tippfehler)! Es ist genau das, was ein wenig verwirrend war: Arrays und Hashes (was sonst?) Können innerhalb einer Funktion geändert werden, ohne $ global zu verwenden: normale Variablen können das nicht. – gooly

+0

Grundsätzlich können Sie den Inhalt eines referenzierten Objekts ändern (Eigenschaften eines Objekts, Elemente in einem Array, Elemente in einer Hashtabelle). Was Sie nicht ändern können, ohne '$ global: 'zu verwenden, ist das tatsächliche Objekt (Array/Hashtabelle) der Variablenreferenzen. –