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




Argomenti della Guida