about_Remote_Variables
Descrição breve
Explica como usar variáveis locais e remotas em comandos remotos.
Descrição longa
Você pode usar variáveis em comandos executados em computadores remotos. Atribua um valor à variável e use a variável no lugar do valor.
Por padrão, as variáveis em comandos remotos são consideradas definidas na sessão que executa o comando. As variáveis definidas em uma sessão local devem ser identificadas como variáveis locais no comando.
Usando variáveis remotas
O PowerShell pressupõe que as variáveis usadas em comandos remotos sejam definidas na sessão na qual o comando é executado.
Neste exemplo, a $ps
variável é definida na sessão temporária na qual o Get-WinEvent
comando é executado.
Invoke-Command -ComputerName S1 -ScriptBlock {
$ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}
Quando o comando é executado em uma sessão persistente, PSSession, a variável remota deve ser definida nessa sessão.
$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}
Usando variáveis locais
Você pode usar variáveis locais em comandos remotos, mas a variável deve ser definida na sessão local.
A partir do PowerShell 3.0, você pode usar o Using
modificador de escopo para identificar uma variável local em um comando remoto.
A sintaxe de Using
é a seguinte:
$Using:<VariableName>
No exemplo a seguir, a $ps
variável é criada na sessão local, mas é usada na sessão em que o comando é executado. O Using
modificador de escopo é identificado $ps
como uma variável local.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
Get-WinEvent -LogName $Using:ps
}
O Using
modificador de escopo pode ser usado em um PSSession.
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}
Uma referência de variável, como $using:var
expande para o valor de variable $var
do contexto do chamador. Você não obtém acesso ao objeto variável do chamador.
O Using
modificador de escopo não pode ser usado para modificar uma variável local dentro do PSSession. Por exemplo, o código a seguir não funciona:
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}
Para obter mais informações sobre Using
o , consulte about_Scopes
Usando splatting
O splatting do PowerShell passa uma coleção de nomes e valores de parâmetro para um comando. Para obter mais informações, consulte about_Splatting.
Neste exemplo, a variável $Splat
splatting é uma tabela de hash configurada no computador local. O se Invoke-Command
conecta a uma sessão de computador remoto. O ScriptBlock usa o Using
modificador de escopo com o símbolo At (@
) para representar a variável espalhada.
$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }
Outras situações em que o modificador de escopo 'Usando' é necessário
Para qualquer script ou comando que seja executado fora da sessão, você precisa do Using
modificador de escopo para incorporar valores de variáveis do escopo da sessão de chamada, para que o código fora da sessão possa acessá-los. O Using
modificador de escopo tem suporte nos seguintes contextos:
- Comandos executados remotamente, iniciados com
Invoke-Command
o uso dos parâmetros ComputerName, HostName, SSHConnection ou Session (sessão remota) - Trabalhos em segundo plano, iniciados com
Start-Job
(sessão fora do processo) - Trabalhos de thread, iniciados por meio
Start-ThreadJob
de ouForEach-Object -Parallel
(sessão de thread separada)
Dependendo do contexto, os valores de variáveis inseridas são cópias independentes dos dados no escopo do chamador ou referências a ele. Em sessões remotas e fora do processo, são sempre cópias independentes. Em sessões de thread, eles são passados por referência.
Serialização de valores de variáveis
Comandos executados remotamente e trabalhos em segundo plano são executados fora do processo. As sessões fora do processo usam serialização e desserialização baseadas em XML para disponibilizar os valores das variáveis entre os limites do processo. O processo de serialização converte objetos em um PSObject que contém as propriedades dos objetos originais, mas não seus métodos.
Para um conjunto limitado de tipos, a desserialização reidrata os objetos de volta ao tipo original. O objeto reidratado é uma cópia da instância do objeto original. Ele tem as propriedades e métodos de tipo. Para tipos simples, como System.Version, a cópia é exata. Para tipos complexos, a cópia é imperfeita. Por exemplo, objetos de certificado reidratados não incluem a chave privada.
Instâncias de todos os outros tipos são instâncias PSObject . A propriedade PSTypeNames contém o nome do tipo original prefixado com Deserialized, por exemplo, Deserialized.System.Data.DataTable
Usando variáveis locais com o parâmetro ArgumentList
Você pode usar variáveis locais em um comando remoto definindo parâmetros para o comando remoto e usando o parâmetro ArgumentList do Invoke-Command
cmdlet para especificar a variável local como o valor do parâmetro.
Use a
param
palavra-chave para definir parâmetros para o comando remoto. Os nomes dos parâmetros são espaços reservados que não precisam corresponder ao nome da variável local.Use os parâmetros definidos pela
param
palavra-chave no comando.Use o parâmetro ArgumentList do
Invoke-Command
cmdlet para especificar a variável local como o valor do parâmetro.
Por exemplo, os comandos a seguir definem a $ps
variável na sessão local e a usam em um comando remoto. O comando usa $log
como nome do parâmetro e a variável local, $ps
, como seu valor.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($log)
Get-WinEvent -LogName $log
} -ArgumentList $ps