2013-01-21 16 views
22

Ho uno script principale, in cui sono definite alcune costanti. Quindi ho un modulo (psm1) per includere le funzioni di supporto. I dettagli sono:Variabili nei moduli in PowerShell

Nello script principale, ho importato il modulo come un oggetto:

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

Nel modulo, ho due variabili,

[string]$SQLServer = $null 

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

la mia comprensione è che, a causa Non sto esportando $SQLServer dal modulo, questa variabile dovrebbe essere locale e dovrei essere in grado di impostarla/ottenerla.

Risulta altrimenti. Dopo aver chiamato SetSQLServerAddr ([string] $name), il callling GetSQLServerAddr restituisce $ null. Cosa mi sono perso?

risposta

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

che crea una nuova locale$SQLServer nel campo di applicazione di tale funzione.

Se si desidera aggiornare una variabile al modulo (.psm1) portata allora avete bisogno di prefisso al nome per indicare che:

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

Per ulteriori informazioni su ambiti di vedere get-help about_scopes.

+0

Ho cercato dappertutto e ho letto about_scopes ma non mi era ancora chiaro che una variabile definita in un modulo può essere impostata utilizzando l'ambito dello script in una funzione all'interno del modulo. L'ambito dello script suona come se fosse un termine improprio nel contesto di un modulo e dovrebbe essere chiamato scope del modulo o qualcosa del genere. La ringrazio per la risposta! –

+1

@ChrisMagnuson Concordo sul fatto che il nome non sia eccezionale, ma ha senso (la differenza rilevante rispetto a uno script "normale" è che lo stato del modulo persiste dopo essere tornato al chiamante). – Richard

Problemi correlati