ARGOMENTO
about_Scopes
DESCRIZIONE BREVE
Illustra il concetto di ambito in Windows PowerShell e come
impostare e modificare l'ambito di elementi.
DESCRIZIONE DETTAGLIATA
In Windows PowerShell viene protetto l'accesso a variabili,
alias, funzioni e unità di Windows PowerShell (PSDrives) limitando le
posizioni da cui è possibile leggere e modificare tali elementi. Mediante
l'applicazione di alcune regole semplici per l'ambito, Windows PowerShell
consente di assicurarsi che non venga modificato inavvertitamente un
elemento da non modificare.
Le regole di base dell'ambito sono le seguenti:
- Un elemento incluso in un ambito è visibile nell'ambito nel
quale è stato creato e negli eventuali ambiti figlio, a
meno che non lo si renda privato in modo esplicito. È possibile
collocare variabili, alias, funzioni o unità di Windows PowerShell in
uno o più ambiti.
- Un elemento creato in un ambito può essere modificato solo
in tale ambito, a meno che non lo si renda privato in modo
esplicito.
Se si crea un elemento in un ambito e tale elemento condivide il
nome con un elemento in un altro ambito, l'elemento originale potrebbe
venire nascosto nel nuovo elemento. L'elemento tuttavia non viene
sostituito né modificato.
Ambiti di Windows PowerShell
Gli ambiti in Windows PowerShell hanno sia nomi che numeri.
Gli ambiti denominati specificano un ambito assoluto. I numeri sono
relativi e riflettono la relazione tra gli ambiti.
Globale:
È l'ambito attivo all'avvio di Windows PowerShell. Le
variabili e le funzioni presenti all'avvio di Windows
PowerShell sono state create nell'ambito globale. Include
variabili automatiche e variabili di preferenza. Include
inoltre le variabili, gli alias e le funzioni presenti nei
profili di Windows PowerShell.
Locale:
È l'ambito corrente. L'ambito locale può essere l'ambito globale o
qualsiasi altro ambito.
Script:
È l'ambito creato durante l'esecuzione di un file di script.
Solo i comandi nello script vengono eseguiti nell'ambito di
script. Per i comandi di uno script, l'ambito di script è l'ambito
locale.
Privato:
Gli elementi nell'ambito privato non possono essere visualizzati
all'esterno dell'ambito corrente. È possibile utilizzare l'ambito
privato per creare una versione privata di un elemento con lo stesso
nome in un altro ambito.
Ambiti numerati:
È possibile fare riferimento agli ambiti in base al nome o a
un numero che ne descrive la posizione relativa rispetto a un
altro ambito.
L'ambito 0 rappresenta l'ambito corrente o locale. L'ambito 1
indica l'ambito padre immediato. L'ambito 2 indica l'ambito padre
dell'ambito padre e così via. Gli ambiti numerati sono utili se sono
stati creati molti ambiti ricorsivi.
Ambiti padre e figlio
È possibile creare un nuovo ambito eseguendo uno script o una
funzione, creando una sessione o avviando una nuova istanza di Windows
PowerShell. Quando si crea un nuovo ambito, il risultato è un ambito padre
(ambito originale) e un ambito figlio (ambito creato).
In Windows PowerShell tutti gli ambiti sono ambiti figlio dell'ambito
globale, ma è possibile creare molti ambiti e ambiti ricorsivi.
A meno che non vengano resi privati in modo esplicito, gli elementi
nell'ambito padre sono disponibili all'ambito figlio. Tuttavia, gli
elementi creati e modificati nell'ambito figlio non hanno effetto
sull'ambito padre, a meno che l'ambito non venga specificato in modo
esplicito quando si creano gli elementi.
Ereditarietà
Un ambito figlio non eredita variabili, alias e funzioni
dall'ambito padre. A meno che un elemento non sia privato, dall'ambito
figlio è possibile visualizzare gli elementi nell'ambito padre. È inoltre
possibile modificare gli elementi specificando in modo esplicito
l'ambito padre, ma gli elementi non fanno parte dell'ambito figlio.
Tuttavia, un ambito figlio viene creato con un set di elementi.
In genere, include tutti gli alias che dispongono dell'opzione
AllScope, che viene presentata più avanti in questo argomento.
Include tutte le variabili che dispongono dell'opzione AllScope,
oltre ad alcune variabili che è possibile utilizzare per
personalizzare l'ambito, ad esempio MaximumFunctionCount.
Per trovare gli elementi in un determinato ambito, utilizzare il
parametro Scope di Get-Variable o Get-Alias.
Ad esempio per ottenere tutte le variabili nell'ambito locale,
digitare:
get-variable -scope local
Per ottenere tutte le variabili nell'ambito globale, digitare:
get-variable -scope global
Modificatori di ambito
Per specificare l'ambito di una nuova variabile, un nuovo alias o
una nuova funzione, utilizzare un modificatore di ambito. I
valori validi di un modificatore sono Global e Script.
La sintassi per un modificatore di ambito in una variabile è la
seguente:
$[<modificatore-ambito>]:<nome> = <valore>
La sintassi per un modificatore di ambito in una funzione è la
seguente:
function [<modificatore-ambito>]:<nome> {<corpo-funzione>}
L'ambito predefinito per gli script è l'ambito di script. L'ambito
predefinito per funzioni e alias è l'ambito locale, anche se sono
definiti in uno script.
Con il comando seguente, in cui non viene utilizzato un
modificatore di ambito, viene creata una variabile nell'ambito
corrente o locale:
$a = "one"
Per creare la stessa variabile nell'ambito globale, utilizzare il
modificatore di ambito Global:
$global:a = "one"
Per creare la stessa variabile nell'ambito di script, utilizzare il
modificatore di ambito Script:
$script:a = "one"
È inoltre possibile utilizzare un modificatore di ambito nelle
funzioni. Nella definizione di funzione seguente viene creata una
funzione nell'ambito globale:
function global:Hello
{
write-host "Hello, World"
}
È inoltre possibile utilizzare modificatori di ambito per fare
riferimento a una variabile in un ambito diverso. Il comando
seguente fa riferimento alla variabile $test, prima nell'ambito
locale, quindi nell'ambito globale:
$test
$global:test
Opzione AllScope
Variabili e alias dispongono di una proprietà Option che può
accettare un valore AllScope. Gli elementi che dispongono della
proprietà AllScope diventano parte di qualsiasi ambito figlio
creato, anche se non vengono ereditati retroattivamente da ambiti
padre.
Un elemento che dispone della proprietà AllScope è visibile
nell'ambito figlio e fa parte di tale ambito. Le modifiche apportate
all'elemento in qualsiasi ambito hanno effetto su tutti gli ambiti in
cui viene definita la variabile.
Gestione dell'ambito
Diversi cmdlet dispongono di un parametro Scope che consente di
ottenere o impostare (creare e modificare) elementi in un
determinato ambito. Utilizzare il comando seguente per trovare tutti i
cmdlet nella sessione che dispongono di un parametro Scope:
get-help * -parameter scope
Per trovare le variabili visibili in un determinato ambito,
utilizzare il parametro Scope di Get-Variable. I parametri visibili
includono parametri globali, nell'ambito padre e nell'ambito corrente.
Ad esempio, con il comando seguente si ottengono le variabili visibili
nell'ambito locale:
get-variable -scope local
Per creare una variabile in un determinato ambito, utilizzare un
modificatore di ambito o il parametro Scope di Set-Variable. Con il
comando seguente viene creata una variabile nell'ambito globale:
new-variable -scope global -name a -value "One"
È inoltre possibile utilizzare il parametro Scope del cmdlet
New-Alias, Set-Alias o Get-Alias per specificare l'ambito. Con il
comando seguente viene creato un alias nell'ambito globale:
new-alias -scope global -name np -value Notepad.exe
Per ottenere le funzioni in un determinato ambito, utilizzare il
cmdlet Get-Item dall'interno dell'ambito. Il cmdlet Get-Item non
dispone di un parametro Scope.
Utilizzo della notazione dot source con l'ambito
Script e funzioni si attengono a tutte le regole dell'ambito. Questi
elementi vengono creati in un determinato ambito e hanno effetto solo
su tale ambito a meno che non si utilizzi un parametro di cmdlet o un
modificatore di ambito per modificare l'ambito.
È tuttavia possibile aggiungere uno script o una funzione all'ambito
corrente tramite la notazione dot source. In questo modo, quando si
esegue uno script nell'ambito corrente, qualsiasi funzione, alias o
variabile creata dallo script è disponibile nell'ambito corrente.
Per aggiungere una funzione all'ambito corrente, digitare un
punto (.) e uno spazio prima del percorso e del nome della
funzione nella chiamata di funzione.
Ad esempio per eseguire lo script Sample.ps1 dalla directory
C:\Scripts nell'ambito di script (impostazione predefinita per
gli script), utilizzare il comando seguente:
c:\scripts\sample.ps1
Per eseguire lo script Sample.ps1 nell'ambito locale, utilizzare
il comando seguente:
. c:\scripts.sample.ps1
Quando si utilizza l'operatore di chiamata (&) per eseguire una
funzione o uno script, esso non viene aggiunto all'ambito corrente.
Nell'esempio seguente viene utilizzato l'operatore di chiamata:
& c:\scripts.sample.ps1
Qualsiasi alias, funzione o variabile creata dallo script
Sample.ps1 non è disponibile nell'ambito corrente.
Limitazione senza ambito
Alcuni concetti di Windows PowerShell sono simili all'ambito o
interagiscono con esso. È possibile che tali concetti vengano
confusi con l'ambito o con il suo comportamento.
Sessioni, moduli e prompt nidificati sono ambienti autosufficienti,
ma non sono ambiti figlio dell'ambito globale della sessione.
Sessioni:
Una sessione è un ambiente in cui viene eseguito Windows
PowerShell.
Quando si crea una sessione in un computer remoto, Windows
PowerShell stabilisce una connessione permanente al computer
remoto. La connessione permanente consente di utilizzare la
sessione per più comandi correlati.
Poiché una sessione è un ambiente autosufficiente, dispone
del proprio ambito. Una sessione non è tuttavia un ambito
figlio della sessione in cui è stata creata. La sessione si
avvia con il proprio ambito globale. Questo ambito è indipendente
dall'ambito globale della sessione.
È possibile creare ambiti figlio nella sessione. Ad esempio è
possibile eseguire uno script per creare un ambito figlio in una
sessione.
Moduli:
È possibile utilizzare un modulo di Windows PowerShell per
condividere e recapitare strumenti di Windows PowerShell. Un
modulo è un'unità che può contenere cmdlet, script, funzioni,
variabili, alias e altri elementi utili. A meno che non siano
definiti in modo esplicito, gli elementi in un modulo non sono
accessibili all'esterno del modulo. Pertanto, è possibile aggiungere
il modulo alla sessione e utilizzare gli elementi pubblici senza
preoccuparsi che gli altri elementi possano sostituire cmdlet,
script, funzioni e altri elementi nella sessione.
La privacy di un modulo ha un comportamento analogo all'ambito, ma
l'aggiunta di un modulo a una sessione non modifica l'ambito. Il
modulo inoltre non dispone di un proprio ambito, anche se gli script
nel modulo, come tutti gli script di Windows PowerShell, hanno un
proprio ambito.
Prompt nidificati:
Analogamente, i prompt nidificati non dispongono di un
proprio ambito. Con l'accesso a un prompt nidificato si
accede a un sottoinsieme dell'ambiente, ma si rimane all'interno
dell'ambito locale.
Gli script dispongono di un proprio ambito. Se si esegue il
debug di uno script e si raggiunge un punto di interruzione
nello script, si entra nell'ambito di script.
Opzione Private:
Alias e variabili dispongono di una proprietà Option che può
accettare un valore Private. Gli elementi che dispongono
dell'opzione Private possono essere visualizzati e modificati
nell'ambito in cui vengono creati, ma non all'esterno di tale ambito.
Ad esempio, se si crea una variabile che dispone di
un'opzione Private nell'ambito globale, quindi si esegue uno
script, con i comandi Get-Variable dello script non viene
visualizzata la variabile privata. Questa situazione si
verifica anche se si utilizza il modificatore di ambito globale.
È possibile utilizzare il parametro Option dei cmdlet
New-Variable, Set-Variable, New-Alias e Set-Alias per impostare il
valore della proprietà Option su Private.
Visibility:
La proprietà Visibility di una variabile o un alias determina se è
possibile vedere l'elemento al di fuori del contenitore, ad esempio
un modulo, nel quale è stato creato. La proprietà Visibility è
progettata per i contenitori, così come il valore Private della
proprietà Option è progettato per gli ambiti.
La proprietà Visibility accetta i valori Public e Private.
Gli elementi che dispongono di visibilità privata possono essere
visualizzati e modificati solo nel contenitore in cui sono stati
creati. Se il contenitore viene aggiunto o importato, gli elementi
che dispongono di visibilità privata non possono essere visualizzati
né modificati.
Poiché la proprietà Visibility è progettata per i
contenitori, funziona in modo diverso in un ambito. Se si crea un
elemento che dispone di visibilità privata nell'ambito globale, non è
possibile visualizzare né modificare l'elemento in qualsiasi ambito.
Se si tenta di visualizzare o modificare il valore di una variabile
che dispone di visibilità privata, in Windows PowerShell viene
restituito un messaggio di errore.
È possibile utilizzare i cmdlet New-Variable e Set-Variable
per creare una variabile con visibilità privata.
ESEMPI
Esempio 1: modificare un valore di variabile solo in uno script
Con il comando seguente il valore della variabile
$ConfirmPreference viene modificato in uno script. La modifica
non ha effetto sull'ambito globale.
Innanzitutto, per visualizzare il valore della variabile
$ConfirmPreference nell'ambito locale, utilizzare il comando seguente:
C:\PS> $ConfirmPreference
High
Creare uno script Scope.ps1 che contiene i comandi seguenti:
$ConfirmPreference = "Low"
"Il valore di `$ConfirmPreference è $ConfirmPreference."
Eseguire lo script. Con lo script viene modificato il valore della
variabile $ConfirmPreference, quindi tale valore viene riportato
nell'ambito di script. L'output deve essere simile al seguente:
Il valore di $ConfirmPreference è Low.
Successivamente, verificare il valore corrente della variabile
$ConfirmPreference nell'ambito corrente.
C:\PS> $ConfirmPreference
High
In questo esempio viene illustrato che le modifiche apportate
al valore di una variabile nell'ambito dello script non hanno
effetto sul valore di tale variabile nell'ambito padre.
Esempio 2: visualizzare un valore di variabile in ambiti diversi
È possibile utilizzare i modificatori di ambito per
visualizzare il valore di una variabile nell'ambito locale e in
un ambito padre.
Innanzitutto, definire una variabile $test nell'ambito globale.
$test = "Global"
Successivamente, creare uno script Sample.ps1 che definisce la
variabile $test. Nello script utilizzare un modificatore di
ambito per fare riferimento alla versione globale o locale
della variabile $test.
# In Sample.ps1
$test = "Local"
"Il valore locale di `$test è $test. "Il valore globale di
`$test è $global:test."
Quando si esegue Sample.ps1, l'output deve essere simile al
seguente:
Il valore locale di $test è Local.
Il valore globale di $test è Global.
Al termine dello script, solo il valore globale di $test viene
definito nella sessione.
C:\PS> $test
Global
Esempio 3: modificare il valore di una variabile in un ambito padre
A meno che non si protegga un elemento tramite l'opzione
Private o un altro metodo, è possibile visualizzare e
modificare il valore di una variabile in un ambito padre.
Innanzitutto, definire una variabile $test nell'ambito globale.
$test = "Global"
Successivamente, creare uno script Sample.ps1 che definisce la
variabile $test. Nello script utilizzare un modificatore di
ambito per fare riferimento alla versione globale o locale
della variabile $test.
# In Sample.ps1
$global:test = "Local"
"Il valore globale di `$test è $global:test."
Al termine dello script, il valore globale di $test è cambiato.
C:\PS> $test
Local
Esempio 4: creare una variabile privata
Una variabile privata è una variabile che dispone di una
proprietà Option con valore Private. Le variabili private vengono
ereditate dall'ambito figlio, ma possono essere visualizzate o
modificate solo nell'ambito in cui sono state create.
Con il comando seguente viene creata una variabile privata
denominata $ptest nell'ambito locale.
new-variable -name ptest -value 1 -option private
È possibile visualizzare e modificare il valore di $ptest
nell'ambito locale.
C:\PS> $ptest
1
C:\PS> $ptest = 2
C:\PS> $ptest
2
Successivamente, creare uno script Sample.ps1 che contiene i comandi
seguenti.
Il comando tenta di visualizzare e modificare il valore di $ptest.
# In Sample.ps1
"Il valore di `$Ptest è $Ptest."
"Il valore di `$Ptest è $global:Ptest."
Poiché la variabile $ptest non è visibile nell'ambito di
script, l'output è vuoto.
"Il valore di $Ptest è ."
"Il valore di $Ptest è ."
VEDERE ANCHE
about_Variables
about_Environment_Variables
about_Functions
about_Script_Blocks