about_Scopes

Aggiornamento: maggio 2014

Si applica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

ARGOMENTO

about_Scopes

DESCRIZIONE BREVE

Illustra il concetto di ambito in Windows PowerShell® e mostra come impostare e modificare l'ambito degli elementi.

DESCRIZIONE LUNGA

Windows PowerShell protegge l'accesso a variabili, alias, funzioni e unità di Windows PowerShell (PSDrives) limitandone la lettura e la modifica. Grazie all'applicazione di alcune semplici regole per l'ambito, Windows PowerShell impedisce che l'utente modifichi inavvertitamente un elemento che non dovrebbe essere modificato.

Di seguito sono riportate le regole di base dell'ambito:

  • - Un elemento incluso in un ambito è visibile nell'ambito in cui è stato creato e in qualsiasi ambito secondario, a meno che non venga reso esplicitamente privato. È possibile inserire variabili, alias, funzioni o unità di Windows PowerShell in uno o più ambiti.

  • - Un elemento che è stato creato all'interno di un ambito può essere modificato solo nell'ambito in cui è stato creato, a meno che non venga specificato un ambito diverso.

Se si crea un elemento in un ambito e l'elemento condivide il nome con un elemento in un ambito diverso, l'elemento originale potrebbe essere nascosto nel nuovo elemento. Tuttavia, non viene sovrascritto o modificato.

AMBITI DI WINDOWS POWERSHELL

Gli ambiti in Windows PowerShell dispongono di nomi e numeri. Gli ambiti dotati di nome specificano un ambito assoluto. I numeri sono relativi e riflettono la relazione tra gli ambiti.

  • Globale:
    L'ambito attivo quando viene avviato Windows PowerShell. Le variabili e le funzioni presenti quando viene avviato Windows PowerShell sono state create nell'ambito globale. Tra queste sono incluse le variabili automatiche e le variabili di preferenza, nonché le variabili, gli alias e le funzioni che si trovano nei profili di Windows PowerShell.
  • Locale:
    L'ambito corrente. L'ambito locale può essere l'ambito globale o qualsiasi altro ambito.
  • Script:
    L'ambito che viene creato durante l'esecuzione di un file di script. Solo i comandi nello script vengono eseguiti nell'ambito di script. Per i comandi in uno script, l'ambito di script è l'ambito locale.
  • Privato:
    Gli elementi nell'ambito privato non sono visibili all'esterno dell'ambito corrente. È possibile usare 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 descrive la posizione relativa di un ambito rispetto a un altro. Ambito 0 rappresenta l'ambito corrente o locale. Ambito 1 indica l'ambito padre. Ambito 2 indica l'elemento padre dell'ambito padre e così via. Gli ambiti numerati sono utili se sono stati creati numerosi ambiti ricorsivi.

AMBITI PADRE E AMBITI 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, si ottiene un ambito padre (l'ambito originale) e un ambito figlio (l'ambito creato).

In Windows PowerShell, tutti gli ambiti sono ambiti figlio dell'ambito globale, ma è possibile creare numerosi ambiti e numerosi ambiti ricorsivi.

A meno che non vengano resi esplicitamente privati, gli elementi nell'ambito padre sono disponibili per l'ambito figlio. Tuttavia, gli elementi creati e modificati nell'ambito figlio non influiscono sull'ambito padre, a meno che non si specifichi l'ambito quando si creano gli elementi.

EREDITARIETÀ

Un ambito figlio non eredita le variabili, gli alias e le funzioni dell'ambito padre. A meno che un elemento non sia privato, l'ambito figlio può visualizzare gli elementi nell'ambito padre. È anche possibile modificare gli elementi specificando l'ambito padre, ma gli elementi non fanno parte dell'ambito figlio.

Tuttavia, viene creato un ambito figlio con un set di elementi. In genere, sono inclusi tutti gli alias che dispongono dell'opzione AllScope. Questa opzione viene illustrata più avanti in questo argomento. Comprende tutte le variabili dotate dell'opzione AllScope, oltre ad alcune variabili che possono essere usate per personalizzare l'ambito, ad esempio MaximumFunctionCount.

Per trovare gli elementi in un determinato ambito, usare 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, di un nuovo alias o di una nuova funzione, usare un modificatore di ambito. I valori validi di un modificatore sono Global, Local, Private e Script.

La sintassi per un modificatore di ambito in una variabile è:

        $[<scope-modifier>]:<name> = <value>

La sintassi per un modificatore di ambito in una funzione è:

        function [<scope-modifier>]:<name> {<function-body>}

L'ambito predefinito per gli script è l'ambito di script. L'ambito predefinito per le funzioni e gli alias è l'ambito locale, anche se sono definiti in uno script.

Il comando seguente, che non usa un modificatore di ambito, crea una variabile nell'ambito corrente o locale:

       $a = "one"

Per creare la stessa variabile nell'ambito globale, usare il modificatore di ambito Global:

       $global:a = "one"

Per creare la stessa variabile nell'ambito di script, usare il modificatore di ambito Script:

       $script:a = "one"

È anche possibile usare un modificatore di ambito nelle funzioni. La definizione di funzione seguente crea una funzione nell'ambito globale:

       function global:Hello
       {
    write-host "Hello, World"
       }

È anche possibile usare i 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 e quindi nell'ambito globale:

      $test

      $global:test

MODIFICATORE DI AMBITO USING

Using è un modificatore di ambito speciale che identifica una variabile locale in un comando remoto. Per impostazione predefinita, si suppone che le variabili nei comandi remoti siano definite nella sessione remota.

Il modificatore di ambito Using è stato introdotto in Windows PowerShell 3.0.

Per altre informazioni, vedere about_Remote_Variables.

OPZIONE ALLSCOPE

Le variabili e gli alias dispongono di una proprietà Option che può accettare un valore AllScope. Gli elementi dotati della proprietà AllScope diventano parte di tutti gli ambiti figlio creati dall'utente, anche se non vengono ereditati in modo retroattivo dagli ambiti padre.

Un elemento che dispone della proprietà AllScope è visibile nell'ambito figlio e fa parte di tale ambito. Le modifiche all'elemento in qualsiasi ambito influiscono su tutti gli ambiti in cui viene definita la variabile.

GESTIONE DELL'AMBITO

Alcuni cmdlet dispongono di un parametro Scope che consente di ottenere o impostare (creare e modificare) gli elementi in un ambito specifico. Usare il comando seguente per trovare tutti i cmdlet nella sessione con un parametro Scope:

         get-help * -parameter scope

Per trovare le variabili visibili in un determinato ambito, usare il parametro Scope di Get-Variable. I parametri visibili includono i parametri globali, i parametri nell'ambito padre e i parametri nell'ambito corrente.Inserire qui il corpo del testo.

Ad esempio, il comando seguente ottiene le variabili che sono visibili nell'ambito locale:

        get-variable -scope local

Per creare una variabile in un ambito specifico, usare un modificatore di ambito o il parametro Scope di Set-Variable. Il comando seguente crea una variabile nell'ambito globale:

        new-variable -scope global -name a -value "One"

È anche possibile usare il parametro Scope dei cmdlet New-Alias, Set-Alias o Get-Alias per specificare l'ambito. Il comando seguente crea un alias nell'ambito globale:

        new-alias -scope global -name np -value Notepad.exe

Per ottenere le funzioni in un determinato ambito, usare il cmdlet Get-Item all'interno dell'ambito. Il cmdlet Get-Item non dispone di un parametro Scope.

USO DELLA NOTAZIONE DOT SOURCE CON L'AMBITO

Gli script e le funzioni seguono tutte le regole di ambito. Vengono creati in un ambito specifico e influiscono solo su quell'ambito, a meno che non venga usato un parametro di cmdlet o un modificatore di ambito per modificare tale ambito.

Tuttavia, è possibile aggiungere uno script o una funzione all'ambito corrente tramite la notazione dot source. Quindi, se uno script viene eseguito nell'ambito corrente, le funzioni, gli alias e le variabili create dallo script sono disponibili 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 (quello predefinito per gli script), usare il comando seguente:

        c:\scripts\sample.ps1

Per eseguire lo script Sample.ps1 nell'ambito locale, usare il comando seguente:

        . c:\scripts.sample.ps1

Quando si usa l'operatore di chiamata (&) per eseguire una funzione o uno script, non viene aggiunto all'ambito corrente. Nell'esempio seguente viene usato l'operatore di chiamata:

        & c:\scripts.sample.ps1

Tutti gli alias, le funzioni o le variabili creati dallo script Sample.ps1 non sono disponibili nell'ambito corrente.

LIMITAZIONE SENZA AMBITO

Alcuni concetti di Windows PowerShell sono simili all'ambito o interagiscono con esso. Questi concetti possono essere confusi con l'ambito o con il comportamento dell'ambito.

Le sessioni, i moduli e i prompt nidificati sono ambienti indipendenti, ma non sono ambiti figlio dell'ambito globale nella 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 usare la sessione per più comandi correlati.

    Poiché una sessione è un ambiente indipendente, ha un proprio ambito, ma una sessione non è un ambito figlio della sessione in cui è stata creata. La sessione viene avviata con il proprio ambito globale. Questo ambito è indipendente dell'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 usare un modulo di Windows PowerShell per condividere e recapitare gli strumenti di Windows PowerShell. Un modulo è un'unità che può contenere cmdlet, script, funzioni, variabili, alias e altri elementi utili. A meno che non vengano definiti in modo esplicito, gli elementi in un modulo non sono accessibili all'esterno del modulo. Pertanto, è possibile aggiungere il modulo alla sessione e usare gli elementi pubblici senza preoccuparsi che gli altri elementi possano sovrascrivere i cmdlet, gli script, le funzioni e gli altri elementi nella sessione.

    La riservatezza di un modulo si comporta come un ambito, ma l'aggiunta di un modulo a una sessione non modifica l'ambito. Il modulo non è dotato di un proprio ambito, anche se gli script nel modulo, come tutti gli script di Windows PowerShell, dispongono del proprio ambito.

  • Prompt nidificati:
    Analogamente, i prompt nidificati non dispongono di un proprio ambito. Quando si immette un prompt nidificato, quest'ultimo è un subset dell'ambiente. Tuttavia, si rimane all'interno dell'ambito locale.

    Gli script hanno un proprio ambito. Se si esegue il debug di uno script e si raggiunge un punto di interruzione nello script, si immette l'ambito dello script.

  • Opzione Private:
    Gli alias e le variabili dispongono di una proprietà Option che può accettare un valore Private. Gli elementi con l'opzione Private possono essere visualizzati e modificati nell'ambito in cui vengono creati, ma non possono essere visualizzati o modificati al di fuori di tale ambito.

    Ad esempio, se si crea una variabile che dispone di un'opzione Private nell'ambito globale e quindi si esegue uno script, i comandi Get-Variable nello script non visualizzano la variabile Private. Ciò si verifica anche se si usa il modificatore di ambito globale.

    È possibile usare il parametro Option dei cmdlet New-Variable, Set-Variable, New-Alias e Set-Alias per impostare il valore della proprietà Option su Private.

  • Visibilità:
    La proprietà Visibility di una variabile o di un alias determina se è possibile visualizzare l'elemento al di fuori del contenitore, ad esempio un modulo, in cui è stato creato. La visibilità è 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 con visibilità privata possono essere visualizzati e modificati solo nel contenitore in cui sono stati creati. Se il contenitore viene aggiunto o importato, non è possibile visualizzare o modificare gli elementi che dispongono di visibilità privata.

    Poiché la visibilità è progettata per i contenitori, funziona in modo diverso in un ambito. Se si crea un elemento con visibilità privata nell'ambito globale, non è possibile visualizzare o modificare l'elemento in qualsiasi ambito. Se si tenta di visualizzare o modificare il valore di una variabile con visibilità privata, Windows PowerShell restituisce un messaggio di errore.

    È possibile usare i cmdlet New-Variable e Set-Variabile per creare una variabile con visibilità privata.

ESEMPI

Esempio 1: Modificare il valore di una variabile solo in uno script

Il comando seguente modifica il valore della variabile $ConfirmPreference in uno script. La modifica non influisce sull'ambito globale.

Prima di tutto, per visualizzare il valore della variabile $ConfirmPreference nell'ambito locale, usare il comando seguente:

          C:\PS> $ConfirmPreference
          High

Creare uno script Scope.ps1 che contiene i comandi seguenti:

          $ConfirmPreference = "Low"
          "The value of `$ConfirmPreference is $ConfirmPreference."

Eseguire lo script. Lo script modifica il valore della variabile $ConfirmPreference e quindi segnala il relativo valore nell'ambito di script. L'output sarà simile a quello riportato di seguito:

          The value of $ConfirmPreference is Low.

In seguito, testare il valore corrente della variabile $ConfirmPreference nell'ambito corrente.

          C:\PS> $ConfirmPreference
          High

Questo esempio mostra che le modifiche apportate al valore di una variabile nell'ambito di script non influiscono sul valore di tale variabile nell'ambito padre.

Esempio 2: Visualizzare il valore di una variabile in ambiti diversi

È possibile usare i modificatori di ambito per visualizzare il valore di una variabile nell'ambito locale e in un ambito padre.

Prima di tutto, definire una variabile $test nell'ambito globale.

        $test = "Global"

Successivamente, creare uno script Sample.ps1 che definisce la variabile $test. Nello script usare un modificatore di ambito per fare riferimento alla versione globale o alla versione locale della variabile $test.Inserire qui il corpo del testo.

          # In Sample.ps1

          $test = "Local"
          "The local value of `$test is $test."
          "The global value of `$test is $global:test."

Quando si esegue Sample.ps1, l'output sarà simile a quello riportato di seguito:

          The local value of $test is Local.
          The global value of $test is Global.

Una volta completato lo script, solo il valore globale di $test è 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.

Prima di tutto, definire una variabile $test nell'ambito globale.

        $test = "Global"

Successivamente, creare uno script Sample.ps1 che definisce la variabile $test. Nello script usare un modificatore di ambito per fare riferimento alla versione globale o alla versione locale della variabile $test.

          # In Sample.ps1

          $global:test = "Local"
          "The global value of `$test is $global:test."

Una volta completato lo script, il valore globale di $test cambia.

          C:\PS> $test
          Local

Esempio 4: Creare una variabile Private

Una variabile Private è 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.

Il comando seguente crea una variabile Private 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

          "The value of `$Ptest is $Ptest."
          "The value of `$Ptest is $global:Ptest."

Poiché la variabile $ptest non è visibile nell'ambito di script, l'output è vuoto.

          "The value of $Ptest is ."
          "The value of $Ptest is ."

Esempio 5: Usare una variabile Local in un comando remoto

Per indicare che è stata creata una variabile in un comando remoto nella sessione locale, usare il modificatore di ambito Using. Per impostazione predefinita, in Windows PowerShell si presuppone che le variabili nei comandi remoti siano create nella sessione remota.

La sintassi è:

           $Using:<VariableName>

Ad esempio, i comandi seguenti creano una variabile $Cred nella sessione locale e quindi la usano in un comando remoto:

           $Cred = Get-Credential
           Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}

L'ambito Using è stato introdotto in Windows PowerShell 3.0.

In Windows PowerShell 2.0, per indicare che è stata creata una variabile nella sessione locale, usare il comando nel formato seguente.

           $Cred = Get-Credential
           Invoke-Command $s {param($c) Remove-Item .\Test*.ps1 -Credential $c} -ArgumentList $Cred

VEDERE ANCHE

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks