Site Overlay

Adam Automatorn

IT-proffs arbetar sällan bara på vår lokala dator. Med PowerShell Invoke-Command cmdlet behöver vi inte! Denna cmdlet tillåter oss att sömlöst skriva kod som om vi arbetade på vår lokala dator.

genom att använda PowerShell Remoting-funktionen ärInvoke-Command cmdlet en vanlig PowerShell cmdlet som tillåter användaren att köra kod inuti en PSSession., Denna PSSession kan antingen vara en som skapats tidigare medNew-PSSession cmdlet eller det kan snabbt skapa och riva ner en tillfällig session också.

Relaterat: PowerShell Remoting: The Ultimate Guide

Tänk på Invoke-Command som PowerShell psexec. Även om de genomförs annorlunda är konceptet detsamma. Ta lite kod eller kommando och kör det ”lokalt” på fjärrdatorn.

För att Invoke-Command ska fungera måste du dock ha PowerShell Remoting aktiverat och tillgängligt på fjärrdatorn., Som standard har alla Windows Server 2012 R2 eller senare maskiner det aktiverat tillsammans med lämpliga brandväggsundantag. Om du är olycklig nog att fortfarande ha Server 2008 maskiner, det finns flera sätt att ställa in Remoting men ett enkelt sätt är genom att köra winrm quickconfig eller Enable-PSRemoting på fjärrdatorn.

för att visa hur Invoke-Command fungerar med ett ”Ad-hoc-kommando” vilket betyder att en som inte kräver att en ny PSSession skapas, låt oss säga att du har en fjärrdator med Windows Server 2012 R2 eller senare domänansluten., Saker blir lite rörigt när man arbetar på arbetsgrupp datorer. Jag öppnar min PowerShell-konsol, skriv Invoke-Command och tryck på Enter.

PS> Invoke-Commandcmdlet Invoke-Command at command pipeline position 1Supply values for the following parameters:ScriptBlock:

Jag blir omedelbart ombedd att tillhandahålla ett scriptblock. Scriptblock är koden som vi ska köra på fjärrdatorn.

så att vi kan bevisa att koden inuti scriptblock körs på fjärrdatorn, låt oss bara köra kommandothostname. Det här kommandot kommer att returnera värdnamnet på den dator den körs på., Körhostname på min lokala dator ger det namnet.

PS> hostnameMACWINVM

låt oss nu skicka ett scriptblock med samma kod inuti ett scriptblock tillInvoke-Command. Innan vi gör det glömmer vi dock en nödvändig parameter: ComputerName. Vi måste berätta för Invoke-Command vilken fjärrdator som ska köras på det här kommandot.

PS> Invoke-Command -ScriptBlock { hostname } -ComputerName WEBSRV1 WEBSRV1

Observera att produktionen avhostname nu är namnet på fjärrdatornWEBSRV1. Du har kört lite kod på WEBSRV1., Att köra enkel kod inuti ett scriptblock och skicka till en enda fjärrmaskin är den enklaste applikationen av Invoke-Command men det kan göra så mycket mer.

Innehållsförteckning

skicka lokala variabler till Fjärrskriptblock

Du kommer inte att ha en enda invoke-kommando referens inuti ett skript. Ditt skript kommer förmodligen att bli dussintals rader långa, ha variabler definierade platser, funktioner definierade i moduler och så vidare., Även om du bara omsluter någon kod i ett par lockiga hängslen kan se oskyldig, ändrar du faktiskt hela omfattningen som koden körs i. När allt kommer omkring skickar du den koden till en fjärrdator. Den fjärrdatorn har ingen aning om all lokal kod på din dator än vad som finns i scriptblock.

till exempel kanske du har en funktion med datornamn och en filsökvägsparameter. Denna funktion syfte är att köra installationsprogrammet på fjärrdatorn., Du kan skicka datornamnet och den” lokala ” sökvägen till installationsprogrammet som redan finns på fjärrdatorn.

funktionen nedan verkar rimlig, eller hur? Nu kör vi.

det misslyckas med ett obskyrt felmeddelande på grund av min användning av ampersand-operatören. Koden var inte fel, men den misslyckades eftersom$InstallerFilePath var tom trots att du passerade in ett värde med funktionsparametern. Vi kan testa detta genom att ersätta ampersand med Write-Host.,

PS> Install-Stuff -ComputerName websrv1 -InstallerFilePath 'C:\install.exe'Installer path is:PS>

Observera att värdet på$InstallerFilePath inte är något. Variabeln har inte expanderat eftersom den inte överfördes till fjärrmaskinen. För att skicka lokalt definierade variabler till fjärrskriptblock, har vi två alternativ; vi kan förord variabelnamnet med $using: inuti scriptblock eller vi kan använda Invoke-Command parameter ArgumentList. Låt oss titta på båda.,

ArgumentList parametern

ett sätt att skicka lokala variabler till ett fjärrskriptblock är att använda parameternInvoke-CommandArgumentList. Med den här parametern kan du skicka lokala variabler till parametern och ersätta lokala variabelreferenser i scriptblock med platshållare.

det är enkelt att skicka de lokala variablerna till parameternArgumentList.

Invoke-Command -ComputerName WEBSRV1 -ScriptBlock { & $InstallerFilePath } -ArgumentList $InstallerFilePath

parameternArgumentList är en objektsamling. Objektsamlingar låter dig skicka ett eller flera objekt åt gången., I det här fallet passerar jag bara en.

När den körs tar invoke-Command cmdlet den samlingen och injicerar sedan den i scriptblock som väsentligen omvandlar den till en array som heter $args. Kom ihåg att $args -eq ArgumentList. Vid denna tidpunkt skulle du referera till varje index i samlingen precis som du skulle en array. I vårt fall hade vi bara ett element i samlingen ($InstallerFilePath) som ”översatt” till $args vilket betyder det första indexet i den samlingen., Men om du hade mer skulle du referera till dem $args, $args och så vidare.

dessutom, om du hellre vill tilldela bättre variabelnamn till scriptblock-variabler, kan du också lägga till parametrar i scriptblock precis som en funktion. När allt kommer omkring är ett scriptblock bara en anonym funktion. För att skapa scriptblock-parametrar, skapa ett paramblock med namnet på parametern. När du har skapat, referera sedan till den parametern i scriptblock som nedan.,

Invoke-Command -ComputerName WEBSRV1 -ScriptBlock { param($foo) & $foo } -ArgumentList $InstallerFilePath

i det här fallet är elementen iArgumentList – samlingen ”mappade” till de definierade parametrarna i ordning. Parameternamnen spelar ingen roll; det är den ordning som är viktig. Invoke-Commandtar det första elementet i samlingen ArgumentList, leta efter den första parametern och kartlägga dessa värden, gör detsamma för den andra, den tredje och så vidare.

$använda konstruera

$using konstruera är ett annat populärt sätt att skicka lokala variabler till en avlägsen scriptblock., Med den här konstruktionen kan du återanvända de befintliga lokala variablerna, men bara prefacing variabelnamnet med $using:. Du behöver inte oroa dig för en$args samling eller lägga till ett parameterblock.

Invoke-Command -ComputerName WEBSRV1 -ScriptBlock { & $using:InstallerFilePath }

PowerShell$using konstruera är mycket enklare men om du någonsin kommer in i lärande Pester, ser du attArgumentList kommer att vara din vän.,

Invoke-Command and New-PSSession

Tekniskt handlar det här inlägget bara om Invoke-Command, men för att visa att det är användbart måste vi kort peka på kommandotNew-PSSession också. Minns tidigare att jag nämndeInvoke-Command kan använda ”ad-hoc” – kommandon eller använda befintliga sessioner.

under hela det här inlägget har vi bara kört ”ad-hoc” – kommandon på fjärrdatorer. Vi har tagit upp en ny session, kör kod och riva ner den., Detta är bra för enstaka situationer men inte så mycket för en tid när du utför dussintals kommandon på samma dator. I det här fallet är det bättre att återanvända en befintlig PSSession genom att skapa en med New-PSSession I förväg.

innan du kör några kommandon måste du först skapa en PSSession med New-PSSession. Vi kan göra detta genom att helt enkelt köra $session = New-PSSession -ComputerName WEBSRV1. Detta skapar en fjärrsession på servern samt en referens till den sessionen på min lokala dator., Vid denna tidpunkt kan jag ersätta min ComputerName referenser med Session och punkt Session till min sparade $session variabel.

Invoke-Command -Session $session -ScriptBlock { & $using:InstallerFilePath }

När du kör, kommer du att märka prestanda är snabbare eftersom sessionen redan har byggts. När du är klar är det dock viktigt att ta bort den öppna sessionen med Remove-PSSession.

sammanfattning

Invoke-Command PowerShell cmdlet är en av de vanligaste och kraftfulla cmdlets som finns. Det är en jag personligen använder mest av nästan alla av dem., Det är användarvänlighet och förmåga att köra någon kod på fjärrdatorer är extremt kraftfull och är ett kommando jag rekommenderar att lära topp till botten!

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *