IT-fagfolk fungerer sjældent kun på vores lokale computer. Brug af Po !ershell Invoke-kommando cmdlet, behøver vi ikke! Denne cmdlet giver os mulighed for problemfrit at skrive kode, som om vi arbejdede på vores lokale computer.
Ved hjælp af PowerShell Remoting funktion, Invoke-Command
cmdlet er et almindeligt anvendt PowerShell-cmdlet, der giver brugeren mulighed for at udføre koden inde i en PSSession., Denne PSSession kan enten være en oprettet tidligere med New-PSSession
cmdlet, eller det kan hurtigt oprette og rive ned en midlertidig session også.
Relateret: PowerShell Remoting: Den Ultimative Guide
Tænk på Påberåbe-Kommando som PowerShell psexec. Selvom de implementeres forskelligt, er konceptet det samme. Tag en smule kode eller kommando og kør den “lokalt” på fjerncomputeren.
for Invoke-Command
for at arbejde skal du dog have Po .ershell Remoting aktiveret og tilgængelig på fjerncomputeren., Som standard har alle machinesindo .s Server 2012 R2 eller nyere maskiner det aktiveret sammen med de relevante fire .all-undtagelser. Hvis du er uheldig nok til stadig at have Server 2008 maskiner, der er flere måder at oprette Remoting, men en nem måde er ved at køre winrm quickconfig
eller Enable-PSRemoting
på fjernbetjeningen maskine.
for at demonstrere, hvordan Invoke-Command fungerer med en “ad hoc-kommando”, hvilket betyder en, der ikke kræver, at der oprettes en ny pssession, lad os sige, at du har en ekstern computerindo .s Server 2012 R2 eller nyere domæne-tilsluttet computer., Ting bliver lidt rodet, når du arbejder på arbejdsgruppecomputere. Jeg åbner min Po .ershell-konsol, skriv Invoke-Command
og tryk på Enter.
PS> Invoke-Commandcmdlet Invoke-Command at command pipeline position 1Supply values for the following parameters:ScriptBlock:
Jeg bliver straks bedt om at give et scriptblock. Scriptblock er den kode, vi skal køre på fjerncomputeren.
så vi kan bevise, at koden inde i scriptblock udføres på fjerncomputeren, lad os bare køre kommandoen hostname
. Denne kommando returnerer værtsnavnet på den computer, den kører på., Kører hostname
på min lokale computer udbytter, er det navn.
PS> hostnameMACWINVM
Lad os nu give en scriptblock med, at samme kode inde i en scriptblock til Invoke-Command
. Før vi gør det, glemmer vi en nødvendig parameter: ComputerName
. Vi skal fortælle Invoke-Command
hvilken fjerncomputer der skal køre denne kommando på.
PS> Invoke-Command -ScriptBlock { hostname } -ComputerName WEBSRV1 WEBSRV1
Bemærk, at produktionen af hostname
er nu navnet på den eksterne computer WEBSRV1
. Du har kørt noget kode på WEBSEBSRV1., Kører enkel kode inde i en scriptblock og passerer til en enkelt fjernbetjening maskine er den nemmeste anvendelse af Invoke-Command
men det kan gøre så meget mere.
Indholdsfortegnelse
overførsel af lokale variabler til eksterne Scriptblocks
Du vil ikke have en enkelt Invoke-kommando reference inde i et script. Dit script vil sandsynligvis være snesevis af linjer lange, har variabler definerede steder, funktioner defineret i moduler og så videre., Selvom bare at omslutte en kode i et par krøllede seler kan se uskyldige ud, ændrer du faktisk hele omfanget, som koden kører i. Når alt kommer til alt sender du denne kode til en fjerncomputer. At fjerncomputeren har ingen ID.om alle de lokale kode på din maskine andet end hvad der er i scriptblock.
for eksempel har du måske en funktion med computernavn og en filstiparameter. Denne funktions formål er at køre noget soft .areinstallationsprogram på fjerncomputeren., Du er i stand til at videregive computernavnet og den “lokale” filsti til installationsprogrammet, der allerede er placeret på fjerncomputeren.
funktionen nedenfor virker rimelig, ikke? Lad os køre det.
det mislykkes med en uklar fejlfejlmeddelelse på grund af min brug af ampersand-operatøren. Koden var ikke forkert, men den mislykkedes, fordi $InstallerFilePath
var tom, selvom du passerede en værdi med funktionsparameteren. Vi kan teste dette ved at erstatte ampersand med Write-Host
.,
PS> Install-Stuff -ComputerName websrv1 -InstallerFilePath 'C:\install.exe'Installer path is:PS>
Bemærk, at værdien af $InstallerFilePath
ikke er noget. Variablen er ikke udvidet, fordi den ikke blev sendt til fjernmaskinen. At passere lokalt definerede variabler til den eksterne scriptblock, vi har fået to valg; vi kan forord variabel navn med $using:
indersiden af scriptblock, eller vi kan bruge Invoke-Command
parameter ArgumentList
. Lad os se på begge dele.,
Argumentlisteparameteren
en måde at overføre lokale variabler til et fjernt scriptblock er at bruge parameterenInvoke-Command
ArgumentList
. Denne parameter giver dig mulighed for at overføre lokale variabler til parameteren og erstatte lokale variable referencer i scriptblock med pladsholdere.
at overføre de lokale variabler tilArgumentList
parameteren er let.
Invoke-Command -ComputerName WEBSRV1 -ScriptBlock { & $InstallerFilePath } -ArgumentList $InstallerFilePath
ArgumentList
parameteren er en objektsamling. Objektsamlinger giver dig mulighed for at passere et eller flere objekter ad gangen., I dette tilfælde passerer jeg bare en.
Når henrettet, Påberåbe-cmdlet-Kommandoen finder, at indsamling og derefter sprøjter det ind i scriptblock væsentlige omdanne den til et array kaldet $args
. Husk at $args -eq ArgumentList
. På dette tidspunkt vil du henvise til hvert indeks i samlingen, ligesom du ville have en Matri.. I vores tilfælde havde vi kun et element i samlingen ($InstallerFilePath
), som “oversat” til $args
betyder det første indeks i denne samling., Men hvis du havde mere, ville du henvise til dem $args
, $args
og så videre.hvis du hellere vil tildele bedre variabelnavne til scriptblock-variabler, kan du også tilføje parametre til scriptblock ligesom en funktion. Når alt kommer til alt er en scriptblock bare en anonym funktion. For at oprette scriptblock-parametre skal du oprette en param-blok med navnet på parameteren. Når den er oprettet, skal du derefter henvise til denne parameter i scriptblock som nedenfor.,
Invoke-Command -ComputerName WEBSRV1 -ScriptBlock { param($foo) & $foo } -ArgumentList $InstallerFilePath
i dette tilfælde”kortlægges”elementerne i samlingen ArgumentList
til de definerede parametre i rækkefølge. Parameternavne betyder ikke noget; det er den rækkefølge, der er vigtig. Invoke-Command
vil tage det første element i ArgumentList
samling, se for den første parameter og kort af disse værdier, gør det samme til den anden, den tredje og så videre.
$ved hjælp af Construct
$using
construct er en anden populær måde at overføre lokale variabler til en fjern scriptblock., Denne konstruktion giver dig mulighed for at genbruge de eksisterende lokale variabler, men blot forord variabelnavnet med $using:
. Du behøver ikke bekymre dig om en $args
samling eller tilføjelse af en parameterblok.
Invoke-Command -ComputerName WEBSRV1 -ScriptBlock { & $using:InstallerFilePath }
PowerShell $using
konstruere er en masse enklere, men hvis du nogensinde kommer til at lære Plager, vil du se, at ArgumentList
vil være din ven.,
Invoke-kommando og Ne.-Pssession
teknisk set handler dette indlæg kun om Invoke-kommando, men for at demonstrere det er nyttigt, skal vi kort berøreNew-PSSession
kommandoen også. Husk tidligere, at jeg nævnte Invoke-Command
kan bruge “ad hoc” kommandoer eller bruge eksisterende sessioner.
i hele dette indlæg har vi lige kørt “ad hoc” kommandoer på eksterne computere. Vi har bragt en ny session op, kører kode og rive den ned., Dette er fint for engangssituationer, men ikke så meget i en tid, hvor du udfører snesevis af kommandoer på den samme computer. I dette tilfælde er det bedre at genbruge en eksisterende PSSession ved at oprette en med New-PSSession
forud for tiden.
Før du kører nogen kommandoer, skal du først oprette en PSSession med New-PSSession
. Vi kan gøre dette ved blot at køre $session = New-PSSession -ComputerName WEBSRV1
. Dette skaber en fjern session på serveren samt en henvisning til denne session på min lokale maskine., På dette punkt, jeg kan udskifte min ComputerName
referencer med Session
og punkt Session
til min gemt $session
variabel.
Invoke-Command -Session $session -ScriptBlock { & $using:InstallerFilePath }
Når løb, vil du bemærke, at ydelsen er hurtigere, fordi sessionen allerede er bygget. Når du er færdig, er det dog vigtigt at fjerne den åbne session med Remove-PSSession
.
resum.
Påkaldskommandoen Po .ershell cmdlet er en af de mest almindelige og kraftfulde cmdlets der findes. Det er en, jeg personligt bruger mest ud af næsten alle dem., Det er brugervenlighed og evne til at køre enhver kode på eksterne computere er ekstremt kraftfuld og er en kommando, jeg anbefaler at lære top til bund!