Parameters verzenden naar externe computers in Windows PowerShell
U hebt al geleerd dat Invoke-Command geen variabelen kan opnemen in het scriptblok of scriptbestand, tenzij de externe computer deze variabelen kan begrijpen. Daarom lijkt het misschien ingewikkelder om een manier te vinden om gegevens van de initiërende computer door te geven aan de externe computer. Invoke-Command biedt echter een specifiek mechanisme voor het uitvoeren van deze taak.
De intentie achter de volgende opdracht is om een lijst weer te geven van de 10 meest recente vermeldingen in het beveiligingslogboek op elke doelcomputer. De opdracht werkt echter niet zoals geschreven:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Get-EventLog –LogName $Log –Newest $Quantity
}
Het probleem is dat de variabelen en $Log betekenissen $Quantity alleen op de lokale computer hebben en deze waarden niet worden ingevoegd in het scriptblok voordat deze waarden naar de externe computers worden verzonden. Daarom weten de externe computers niet wat ze betekenen.
De juiste syntaxis voor deze opdracht is als volgt:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Param($x,$y) Get-EventLog –LogName $x –Newest $y
} –ArgumentList $Log,$Quantity
Met deze syntaxis worden de lokale variabelen doorgegeven aan de parameter ArgumentList van Invoke-Command. In het scriptblok wordt een Param() -blok gemaakt, dat hetzelfde aantal variabelen bevat als de –ArgumentList-lijst met waarden, die in dit geval twee is. Houd er rekening mee dat u namen kunt toewijzen aan de variabelen in het param() -blok. Ze ontvangen gegevens van de parameter ArgumentList op basis van de volgorde. Met andere woorden, omdat $Log de waarde voor het eerst op ArgumentList is vermeld, wordt de waarde doorgegeven aan $x omdat dit de eerste vermelding is in het blok Param(). De variabelen in het param() -blok kunnen vervolgens worden gebruikt in het scriptblok, zoals wordt weergegeven in het voorbeeld.
Deze syntaxis werkt voor Windows PowerShell 2.0 en hoger. Windows PowerShell 3.0 heeft echter een vereenvoudigde alternatieve benadering geïntroduceerd. Als u een lokale variabele $variablehebt en u de inhoud ervan wilt opnemen in een opdracht die wordt uitgevoerd op een externe computer, kunt u de volgende syntaxis uitvoeren:
Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE
Het $Using: voorvoegsel wordt correct verwerkt door de lokale en externe computers, wat resulteert in het $Using:variable vervangen door de inhoud van de lokale variabele $variable.