2013-01-21 11 views
22

Ich habe ein Hauptskript, in dem einige Konstanten definiert sind. Ich habe dann ein Modul (psm1), um Hilfsfunktionen einzuschließen. Die Details sind:Variablen in Modulen in PowerShell

Im Haupt Skript, ich habe das Modul als ein Objekt importiert:

$cud2ADhleper = Import-Module -Force $cud2ADhelperModule -AsCustomObject 

Im Modul, ich habe zwei Variablen,

[string]$SQLServer = $null 

Function SetSQLServerAddr ([string] $name) 
{ 
    $SQLServer = $name 
} 
Function GetSQLServerAddr 
{ 
    return $SQLServer 
} 

Mein Verständnis ist, dass, weil Ich exportiere nicht $SQLServer aus dem Modul, diese Variable sollte lokal sein, und ich sollte Set/Get es sein können.

Es stellt sich heraus, anders. Nachdem ich SetSQLServerAddr ([string] $name) angerufen habe, gibt der Aufruf GetSQLServerAddr $ null zurück. Was habe ich verpasst?

Antwort

27
Function SetSQLServerAddr ([string] $name) 
{ 
    $SQLServer = $name 
} 

, dass ein neues lokale$SQLServer in dem Anwendungsbereich dieser Funktion erstellt.

Wenn Sie eine Variable auf Modul aktualisiert werden soll (.psm1) Umfang dann müssen Sie den Namen voranzustellen, dass, um anzuzeigen:

Function SetSQLServerAddr ([string] $name) 
{ 
    $script:SQLServer = $name 
} 

Weitere Informationen über die Bereiche get-help about_scopes sehen.

+0

Ich habe überall gesucht und about_scopes gelesen, aber es war mir immer noch nicht klar, dass eine in einem Modul definierte Variable mit dem Skriptbereich in einer Funktion innerhalb des Moduls festgelegt werden kann. Der Skriptbereich klingt wie er ist im Kontext eines Moduls falsch und sollte Modulumfang oder etwas ähnliches genannt werden. Vielen Dank für Ihre Antwort! –

+1

@ChrisMagnuson Ich stimme zu, der Name ist nicht groß, aber es macht Sinn (der relevante Unterschied zu einem "normalen" Skript ist, dass der Modulstatus nach dem Zurückkehren zum Aufrufer bestehen bleibt). – Richard

Verwandte Themen