Inviare parametri a computer remoti in Windows PowerShell

Completato

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.