Send parametre til fjerncomputere i Windows PowerShell

Fuldført

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.