Inviare parametri a computer remoti in Windows PowerShell
Invoke-Command non può includere variabili nel blocco di script o nel file di script, a meno che il computer remoto non possa risolverle. Fortunatamente, Invoke-Command fornisce un modo predefinito per passare i dati dal computer locale ai computer remoti.
Il comando seguente è progettato per visualizzare le 10 voci più recenti del registro eventi di sicurezza in ogni computer di destinazione, ma non funzionerà come scritto:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Get-WinEvent –LogName $Log –MaxEvents $Quantity
}
Le variabili $Log e $Quantity esistono solo nel computer locale. I valori non vengono inseriti nel blocco di script prima dell'invio ai computer remoti, in modo che i computer remoti non possano risolverli.
Passare variabili con ArgumentList
La sintassi corretta per questo comando è la seguente:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Param($x,$y) Get-WinEvent –LogName $x –MaxEvents $y
} –ArgumentList $Log,$Quantity
Note
Questi esempi usano Get-WinEvent, la sostituzione moderna per il cmdlet Get-EventLog deprecato.
Get-WinEvent usa -MaxEvents invece di -Newest limitare i risultati.
Le variabili locali vengono passate al -ArgumentList parametro di Invoke-Command. All'interno del blocco di script, un blocco Param() dichiara lo stesso numero di variabili di valori in -ArgumentList, in questo caso due. È possibile assegnare nomi alle variabili nel blocco Param(). Ricevono valori da -ArgumentList in ordine, quindi, poiché $Log viene elencato per primo, il relativo valore passa a $x, che è la prima voce in Param(). Le variabili di blocco Param() sono quindi disponibili in tutto il blocco di script.
Utilizzare il prefisso $Using:
Questa sintassi funziona per Windows PowerShell 2.0 e versioni successive. Windows PowerShell 3.0 ha introdotto un'alternativa più semplice. Se si dispone di una variabile $variable locale e si vuole usare il relativo valore in un comando eseguito in un computer remoto, usare il $Using: prefisso :
Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE
Sia i computer locali che remoti elaborano correttamente il $Using: prefisso, sostituendo $Using:variable con il valore di locale $variable.