Send parametre til fjerncomputere i Windows PowerShell
Du har allerede lært, at Invoke-Command ikke kan inkludere variabler i scriptblokken eller scriptfilen, medmindre fjerncomputeren kan forstå disse variabler. Det kan derfor virke mere kompliceret at finde en måde at overføre data fra den indledende computer til fjerncomputeren på. Invoke-Command- indeholder dog en bestemt mekanisme til at udføre denne opgave.
For at gennemse er hensigten med følgende kommando at vise en liste over de 10 nyeste poster i sikkerhedshændelsesloggen på hver enkelt målrettet computer. Kommandoen fungerer dog ikke som skrevet:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Get-EventLog –LogName $Log –Newest $Quantity
}
Problemet er, at variablerne $Log og $Quantity kun har betydninger på den lokale computer, og disse værdier indsættes ikke i scriptblokken, før disse værdier sendes til fjerncomputerne. Derfor ved fjerncomputerne ikke, hvad de betyder.
Den korrekte syntaks for denne kommando er som følger:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Param($x,$y) Get-EventLog –LogName $x –Newest $y
} –ArgumentList $Log,$Quantity
Ved hjælp af denne syntaks overføres de lokale variabler til parameteren ArgumentList for Invoke-Command. I scriptblokken oprettes der en Param() blok, som indeholder det samme antal variabler som –ArgumentList liste over værdier, som i dette tilfælde er to. Bemærk, at du kan tildele alle navne til variablerne i Param() blok. De modtager data fra parameteren ArgumentList baseret på rækkefølge. Da $Log blev angivet først på ArgumentList, overføres dens værdi med andre ord til $x, fordi det er den første post i Param()-blokken. Variablerne i Param() blok kan derefter bruges i scriptblokken, som vist i eksemplet.
Denne syntaks fungerer for Windows PowerShell 2.0 og nyere. Windows PowerShell 3.0 introducerede dog en forenklet alternativ tilgang. Hvis du har en lokal variabel $variable, og du vil medtage dens indhold i en kommando, der skal køres på en fjerncomputer, kan du køre følgende syntaks:
Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE
Præfikset $Using: behandles korrekt af de lokale computere og fjerncomputere, hvilket medfører, at $Using:variable erstattes med indholdet af den lokale variabel $variable.