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