DET profesjonelle sjelden fungerer bare på vår lokale datamaskinen. Ved hjelp av PowerShell Invoke-Command-cmdlet-en, vi trenger ikke å! Denne cmdleten gir oss muligheten til sømløst å skrive kode som om vi var i arbeide på vår lokale datamaskinen.
Ved hjelp av PowerShell Remoting-funksjonen, Invoke-Command
cmdlet-er en vanlig brukt PowerShell-cmdlet som tillater brukeren å kjøre kode på innsiden av en PSSession., Dette PSSession kan enten være en opprettet tidligere med New-PSSession
cmdlet-en, eller det kan raskt opprette og rive ned et midlertidig økt i tillegg.
i Slekt: PowerShell Remoting: The Ultimate Guide
Tenk på Invoke-Command som PowerShell psexec. Selv om de er implementert på en annen måte, er konseptet det samme. Ta en bit kode eller kommando og kjøre det «lokalt» på den eksterne datamaskinen.
For Invoke-Command
for å arbeide skjønt, må du ha PowerShell Remoting-funksjonen aktivert, og som er tilgjengelig på den eksterne datamaskinen., Som standard, vil alle Windows Server 2012 R2 eller nyere maskiner gjør har det aktivert sammen med de aktuelle brannmur unntak. Hvis du er uheldig nok til å fortsatt ha Server 2008 maskiner, det er flere måter å sette opp Remoting, men en enkel måte er ved å kjøre winrm quickconfig
eller Enable-PSRemoting
på den eksterne maskinen.
for Å vise hvordan Invoke-Command arbeider med en «ad-hoc-kommando», som betyr en som ikke krever en ny PSSession å bli opprettet, la oss si at du har en ekstern Windows Server 2012 R2 eller senere domene datamaskinen., Ting blir litt rotete når du arbeider på datamaskiner i arbeidsgruppen. Jeg vil åpne opp min PowerShell-konsollen, skriver du inn Invoke-Command
og trykk Enter.
PS> Invoke-Commandcmdlet Invoke-Command at command pipeline position 1Supply values for the following parameters:ScriptBlock:
jeg umiddelbart bedt om å gi en scriptblock. Den scriptblock er koden som vi kommer til å kjøre på den eksterne datamaskinen.
Slik at vi kan bevise at koden innsiden av scriptblock er utført på den eksterne datamaskinen, la oss bare kjøre hostname
– kommandoen. Denne kommandoen vil returnere vertsnavnet for datamaskinen som kjører på., Kjører hostname
på min lokale datamaskin gir det navnet.
PS> hostnameMACWINVM
La oss nå gå en scriptblock med at samme kode på innsiden av en scriptblock til Invoke-Command
. Før vi gjør det selv, vi er å glemme en nødvendig parameter: ComputerName
. Vi har å fortelle Invoke-Command
hva eksterne maskinen for å kjøre denne kommandoen på.
PS> Invoke-Command -ScriptBlock { hostname } -ComputerName WEBSRV1 WEBSRV1
legg Merke til at resultatet av hostname
er nå navnet på den eksterne datamaskinen WEBSRV1
. Du har kjørt noen kode på WEBSRV1., Kjører enkel kode på innsiden av en scriptblock og pasning til en enkelt ekstern maskin er den enkleste bruk av Invoke-Command
men det kan du gjøre så mye mer.
Innholdsfortegnelse
Passerer Lokale Variabler til Eksterne Scriptblocks
Du kommer ikke til å ha et enkelt Invoke-Command reference innsiden av et skript. Skriptet er trolig kommer til å være dusinvis av linjer lange, har variabler som er definert steder, funksjoner definert i moduler og så videre., Selv om bare ramme noen kode i et par krøllparentes kan se uskyldig, du er faktisk å endre hele omfang at koden er i gang. Tross alt, du sende koden til en ekstern datamaskin. Den eksterne datamaskinen har ingen anelse om alle de lokale koden på din maskin andre enn hva som er i scriptblock.
For eksempel, kanskje du har fått en funksjon med navn på datamaskinen og en filbane parameter. Denne funksjonen ‘ s formål er å kjøre noen installer programvare på den eksterne datamaskinen., Du er i stand til å passere datamaskin navn og «lokale» fil stien til installasjonsprogrammet som allerede ligger på den eksterne datamaskinen.
funksjonen nedenfor virker rimelig, riktig? La oss kjøre det.
Det mislykkes med en ukjent feil feilmelding på grunn av min bruk av tegnet operatør. Koden var ikke galt, men det mislyktes fordi $InstallerFilePath
var tom, selv om du har passert en verdi i med funksjonen som parameter. Vi kan teste dette ved å erstatte tegnet med Write-Host
.,
PS> Install-Stuff -ComputerName websrv1 -InstallerFilePath 'C:\install.exe'Installer path is:PS>
legg Merke til at verdien av $InstallerFilePath
er ingenting. Variabelen har ikke utvidet seg fordi det ikke var sendt til den eksterne maskinen. Å passere lokalt definerte variabler til den eksterne scriptblock, har vi to valg; vi kan forord variabelnavn med $using:
innsiden av scriptblock eller vi kan bruke Invoke-Command
– parameteren ArgumentList
. La oss se på begge.,
De ArgumentList Parameteren
En måte å passere lokale variabler til en ekstern scriptblock er å bruke Invoke-Command
ArgumentList
– parameteren. Denne parameteren gir deg mulighet til å passere lokale variabler til parameter og erstatte lokal variabel referanser i scriptblock med plassholdere.
Passerer den lokale variabler til ArgumentList
parameteren er enkelt.
Invoke-Command -ComputerName WEBSRV1 -ScriptBlock { & $InstallerFilePath } -ArgumentList $InstallerFilePath
ArgumentList
parameteren er et objekt samling. Objektet samlinger tillate deg å passere ett eller flere objekter på en gang., I dette tilfellet, jeg er bare passerer en.
Når utført, Invoke-Command-cmdlet som tar samling og deretter injiserer det i scriptblock hovedsak transformere det til en matrise kalles $args
. Husk at $args -eq ArgumentList
. På dette punktet, vil du hver referanse indeks av samlingen akkurat som du ville gjort med et utvalg. I vårt tilfelle, hadde vi bare ett element i samlingen ($InstallerFilePath
) som «oversatt» til $args
som betyr den første indeksen i samlingen., Imidlertid, hvis du hadde mer, du vil referansen med dem $args
, $args
og så videre.
i Tillegg, hvis du heller vil tilordne bedre variabelnavn scriptblock variabler, kan du også legge til parametere i scriptblock akkurat som en funksjon. Tross alt, er en scriptblock er bare en anonym funksjon. For å skape scriptblock parametre, kan du opprette en param blokk med navnet på parameteren. Når den er laget, så referanse som parameter i scriptblock som nedenfor.,
Invoke-Command -ComputerName WEBSRV1 -ScriptBlock { param($foo) & $foo } -ArgumentList $InstallerFilePath
I dette tilfellet, elementer i ArgumentList
samling er «kartlagt» til definerte parametere for. Parameteren navn ikke saken; det er den rekkefølgen som er viktig. Invoke-Command
vil ta det første elementet i ArgumentList
samling, se for første parameter og kart disse verdiene gjør det samme for den andre, tredje og så videre.
Den $Bruke Konstruere
$using
konstruere er en annen populær måte å passere lokale variabler til en ekstern scriptblock., Denne modellen gir deg mulighet til å gjenbruke eksisterende lokale variabler, men rett og slett prefacing variabelnavn med $using:
. Ingen trenger å bekymre deg om en $args
samling eller legge til en parameter block.
Invoke-Command -ComputerName WEBSRV1 -ScriptBlock { & $using:InstallerFilePath }
PowerShell $using
konstruere er en mye enklere, men hvis du noen gang kommer til å lære Plage, vil du se at ArgumentList
vil være din venn.,
Invoke-Command og Ny-PSSession
Teknisk, dette innlegget er bare om Invoke-Command men for å demonstrere det er nytten, må vi kort trykk på New-PSSession
kommando som godt. Husker tidligere som jeg nevnte Invoke-Command
kan bruke «ad-hoc» – kommandoer eller bruke eksisterende økter.
Hele dette innlegget, vi har bare vært i drift «ad-hoc» – kommandoer på eksterne datamaskiner. Vi har vært å bringe opp en ny økt, kjører kode og rive det ned., Dette er fine for one-off situasjoner, men ikke så mye for en tid når du utfører dusinvis av kommandoer på samme datamaskin. I dette tilfellet, er det bedre å gjenbruke en eksisterende PSSession ved å opprette en med New-PSSession
forut for sin tid.
Før du kjører noen kommandoer, du må først opprette en PSSession med New-PSSession
. Vi kan gjøre dette ved å kjøre $session = New-PSSession -ComputerName WEBSRV1
. Dette skaper en ekstern økt på serveren, så vel som en referanse til at økt på min lokale maskin., På dette punktet, jeg kan erstatte min ComputerName
referanser med Session
og punkt Session
til mine lagrede $session
variabel.
Invoke-Command -Session $session -ScriptBlock { & $using:InstallerFilePath }
Når løp, vil du legge merke til ytelse som er raskere, fordi økten har allerede blitt bygget. Når du er ferdig selv om det er viktig å fjerne åpent møte med Remove-PSSession
.
Oppsummering
Invoke-Command PowerShell-cmdlet-er en av de mest vanlige og kraftig cmdlets det er. Det er en jeg personlig bruker mest ut av nesten alle av dem., Det er brukervennlighet og muligheten til å kjøre en kode på eksterne datamaskiner er ekstremt kraftig og er en kommando anbefaler jeg å lære topp til bunn!