Inviare parametri a computer remoti in Windows PowerShell
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
.