Enviar parâmetros para computadores remotos no Windows PowerShell

Concluído

Você já aprendeu que Invoke-Command não pode incluir variáveis em seu bloco de script ou arquivo de script, a menos que o computador remoto possa entender essas variáveis. Como tal, pode parecer mais complicado encontrar uma maneira de passar dados do computador iniciador para o computador remoto. No entanto, Invoke-Command realmente fornece um mecanismo específico para realizar essa tarefa.

Para examinar, a intenção por trás do comando a seguir é exibir uma lista das 10 entradas de log de eventos de segurança mais recentes em cada computador de destino. No entanto, o comando não funcionará conforme escrito:

$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
  Get-EventLog –LogName $Log –Newest $Quantity
}

O problema é que as variáveis $Log e $Quantity têm significados apenas no computador local, e esses valores não são inseridos no bloco de script antes que esses valores sejam enviados para os computadores remotos. Portanto, os computadores remotos não sabem o que as variáveis significam.

A sintaxe correta para este comando é a seguinte:

$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
  Param($x,$y) Get-EventLog –LogName $x –Newest $y
} –ArgumentList $Log,$Quantity

Usando essa sintaxe, as variáveis locais são passadas para o parâmetro ArgumentList de Invoke-Command. Dentro do bloco de script, um bloco Param() é criado, que contém o mesmo número de variáveis que a lista –ArgumentList de valores, que, nesse caso, é dois. Observe que você pode atribuir nomes às variáveis no bloco Param( ). Eles receberão dados do parâmetro ArgumentList com base na ordem. Em outras palavras, como $Log foi listado primeiro em ArgumentList, seu valor será passado para $x, porque essa é a primeira entrada no bloco Param(). As variáveis no bloco Param() podem ser usadas dentro do bloco de script, conforme descrito no exemplo.

Essa sintaxe funcionará para o Windows PowerShell 2.0 e mais recentes. No entanto, o Windows PowerShell 3.0 introduziu uma abordagem alternativa simplificada. Se você tiver uma variável local $variable e quiser incluir o conteúdo dela em um comando que será executado em um computador remoto, poderá executar a seguinte sintaxe:

Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE

O prefixo $Using: é processado corretamente pelos computadores locais e remotos, resultando na substituição de $Using:variable pelo conteúdo da variável local $variable.