Enviar parâmetros para computadores remotos no Windows PowerShell
O Invoke-Command não pode incluir variáveis em seu bloco de script ou arquivo de script, a menos que o computador remoto possa resolvê-las. Felizmente, Invoke-Command fornece uma maneira interna de passar dados do computador local para os computadores remotos.
O comando a seguir destina-se a exibir as 10 entradas de log de eventos de segurança mais recentes em cada computador de destino, mas não funcionará como escrito:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Get-WinEvent –LogName $Log –MaxEvents $Quantity
}
As variáveis $Log e $Quantity existem apenas no computador local. Seus valores não são inseridos no bloco de script antes de serem enviados para os computadores remotos, portanto, os computadores remotos não podem resolvê-los.
Passar variáveis com ArgumentList
A sintaxe correta para este comando é a seguinte:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Param($x,$y) Get-WinEvent –LogName $x –MaxEvents $y
} –ArgumentList $Log,$Quantity
Note
Esses exemplos usam Get-WinEvent, a substituição moderna para o cmdlet Get-EventLog preterido.
Get-WinEvent usa -MaxEvents em vez de -Newest limitar os resultados.
As variáveis locais são passadas para o -ArgumentList parâmetro de Invoke-Command. Dentro do bloco de script, um bloco Param() declara o mesmo número de variáveis que os valores em -ArgumentList— nesse caso, dois. Você pode atribuir nomes às variáveis no bloco Param( ). Eles recebem valores de -ArgumentList na ordem; portanto, como $Log está listado primeiro, seu valor é enviado para $x, que é a primeira entrada em Param(). As variáveis de bloco Param() estão disponíveis em todo o bloco de script.
Use o prefixo $Using:
Essa sintaxe funciona para Windows PowerShell 2.0 e posterior. Windows PowerShell 3.0 introduziu uma alternativa mais simples. Se você tiver uma variável $variable local e quiser usar seu valor em um comando executado em um computador remoto, use o $Using: prefixo:
Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE
Os computadores locais e remotos processam o $Using: prefixo corretamente, substituindo $Using:variable pelo valor do local $variable.