Inviare parametri a computer remoti in Windows PowerShell

Completato

Si è già appreso che Invoke-Command può includere variabili nel relativo blocco di script o file di script solo se il computer remoto è in grado di riconoscerle. Di conseguenza, potrebbe sembrare più complicato trovare un modo per passare i dati dal computer di origine a quello remoto. Tuttavia, Invoke-Command in realtà prevede un meccanismo specifico per eseguire questa attività.

Lo scopo del comando seguente è visualizzare un elenco delle 10 voci più recenti del log eventi di sicurezza in ogni computer di destinazione. Tuttavia, il comando non funzionerà così come è scritto:

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

Il problema è che le variabili $Log e $Quantity sono significative solo nel computer locale e questi valori non vengono inseriti nel blocco di script prima che vengano inviati ai computer remoti. Pertanto, i computer remoti non ne riconoscono il significato.

La sintassi corretta per questo comando è la seguente:

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

Con questa sintassi, le variabili locali vengono passate al parametro ArgumentList di Invoke-Command. All'interno del blocco di script viene creato un blocco Param(), che contiene lo stesso numero di variabili dell'elenco di valori –ArgumentList che, in questo caso è due. Si noti che è possibile assegnare qualsiasi nome alle variabili all'interno del blocco Param(). Riceveranno i dati dal parametro ArgumentList in base all'ordine. In altri termini, poiché $Log è la prima voce dell'elenco ArgumentList, il relativo valore verrà passato a $x perché è la prima voce del blocco Param(). Le variabili nel blocco Param() possono quindi essere usate all'interno del blocco di script, come illustrato nell'esempio.

Questa sintassi funzionerà per Windows PowerShell 2.0 e versioni successive. Tuttavia, in Windows PowerShell 3.0 è stato introdotto un approccio alternativo semplificato. Se è disponibile una variabile locale $variable e si vuole includere il relativo contenuto in un comando che verrà eseguito in un computer remoto, è possibile usare la sintassi seguente:

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

Il prefisso $Using: viene elaborato correttamente dai computer locali e remoti, per cui $Using:variable viene sostituito dal contenuto della variabile locale $variable.