about_Remote_Variables

Descrizione breve

Illustra come usare le variabili locali e remote nei comandi remoti.

Descrizione lunga

È possibile usare le variabili nei comandi eseguiti nei computer remoti. Assegnare un valore alla variabile e quindi usare la variabile al posto del valore .

Per impostazione predefinita, si presuppone che le variabili nei comandi remoti vengano definite nella sessione che esegue il comando. Le variabili definite in una sessione locale devono essere identificate come variabili locali nel comando .

Uso di variabili remote

PowerShell presuppone che le variabili usate nei comandi remoti siano definite nella sessione in cui viene eseguito il comando.

In questo esempio la $ps variabile viene definita nella sessione temporanea in cui viene eseguito il Get-WinEvent comando.

Invoke-Command -ComputerName S1 -ScriptBlock {
  $ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}

Quando il comando viene eseguito in una sessione persistente, PSSession, la variabile remota deve essere definita in tale sessione.

$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}

Uso delle variabili locali

È possibile usare variabili locali nei comandi remoti, ma la variabile deve essere definita nella sessione locale.

A partire da PowerShell 3.0, è possibile usare il Using modificatore di ambito per identificare una variabile locale in un comando remoto.

La sintassi di Using è la seguente:

$Using:<VariableName>

Nell'esempio seguente la $ps variabile viene creata nella sessione locale, ma viene usata nella sessione in cui viene eseguito il comando. Il modificatore di Using ambito identifica $ps come variabile locale.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  Get-WinEvent -LogName $Using:ps
}

Il Using modificatore di ambito può essere usato in una sessione PSSession.

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}

Un riferimento a variabile, $using:var ad esempio, si espande al valore della variabile $var dal contesto del chiamante. Non si ottiene l'accesso all'oggetto variabile del chiamante. Il Using modificatore di ambito non può essere usato per modificare una variabile locale all'interno della sessione PSSession. Ad esempio, il codice seguente non funziona:

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}

Per altre informazioni su Using, vedere about_Scopes

Uso dello splatting

Lo splatting di PowerShell passa una raccolta di nomi di parametri e valori a un comando. Per altre informazioni, vedere about_Splatting.

In questo esempio, la variabile $Splat splatting è una tabella hash configurata nel computer locale. Si Invoke-Command connette a una sessione computer remota. ScriptBlock usa il Using modificatore di ambito con il simbolo At (@) per rappresentare la variabile splatted.

$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }

Altre situazioni in cui è necessario il modificatore di ambito "Using"

Per qualsiasi script o comando che viene eseguito all'esterno della sessione, è necessario il Using modificatore di ambito per incorporare i valori delle variabili dall'ambito della sessione chiamante, in modo che il codice fuori sessione possa accedervi. Il Using modificatore di ambito è supportato nei contesti seguenti:

  • Comandi eseguiti in remoto, iniziati con Invoke-Command l'uso dei parametri ComputerName, HostName, SSH Connessione ion o Session (sessione remota)
  • Processi in background, avviati con Start-Job (sessione out-of-process)
  • Processi thread, avviati tramite Start-ThreadJob o ForEach-Object -Parallel (sessione di thread separata)

A seconda del contesto, i valori delle variabili incorporate sono copie indipendenti dei dati nell'ambito del chiamante o riferimenti a esso. Nelle sessioni remote e out-of-process, sono sempre copie indipendenti. Nelle sessioni di thread vengono passate per riferimento.

Serializzazione dei valori delle variabili

I comandi e i processi in background eseguiti in remoto vengono eseguiti out-of-process. Le sessioni out-of-process usano la serializzazione basata su XML e la deserializzazione per rendere disponibili i valori delle variabili attraverso i limiti del processo. Il processo di serializzazione converte gli oggetti in un PSObject che contiene le proprietà degli oggetti originali, ma non i relativi metodi.

Per un set limitato di tipi, la deserializzazione riattiva gli oggetti nel tipo originale. L'oggetto riattivato è una copia dell'istanza dell'oggetto originale. Ha le proprietà e i metodi del tipo. Per i tipi semplici, ad esempio System.Version, la copia è esatta. Per i tipi complessi, la copia è imperfetta. Ad esempio, gli oggetti certificato riattivati non includono la chiave privata.

Le istanze di tutti gli altri tipi sono istanze di PSObject . La proprietà PSTypeNames contiene il nome del tipo originale preceduto da Deserialized, ad esempio Deserialized.System.Data.DataTable

Uso di variabili locali con il parametro ArgumentList

È possibile usare le variabili locali in un comando remoto definendo i parametri per il comando remoto e usando il parametro ArgumentList del Invoke-Command cmdlet per specificare la variabile locale come valore del parametro.

  • Usare la param parola chiave per definire i parametri per il comando remoto. I nomi dei parametri sono segnaposto che non devono corrispondere al nome della variabile locale.

  • Usare i parametri definiti dalla param parola chiave nel comando .

  • Usare il parametro ArgumentList del Invoke-Command cmdlet per specificare la variabile locale come valore del parametro.

Ad esempio, i comandi seguenti definiscono la $ps variabile nella sessione locale e quindi la usano in un comando remoto. Il comando usa $log come nome del parametro e la variabile locale, $ps, come valore.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  param($log)
  Get-WinEvent -LogName $log
} -ArgumentList $ps

Vedi anche