Säg Hej till PowerShell

PowerShell har utvecklats i över tio år. Microsoft fortsätter att satsa på utveckling och adoption. Dessa investeringar har förvandlat den lätthet och robusthet med vilken utvecklare och administratörer kan automatisera Windows-uppgifter.


Vad är PowerShell?

PowerShell löser administrativa och anpassningsbara utmaningar genom att seamlessly integrera .NET Framework.

PowerShell är Microsofts uppgiftsautomatiseringsramverk, som består av ett kommandoradsskal, en integrerad skriptmiljö (ISE), ett skriptspråk byggt på .NET Framework, ett API som låter dig vara värd för PowerShell i dina .NET-applikationer och det är en distribuerad automationsplattform. PowerShell ger fullständig åtkomst till COM och WMI, så att du kan utföra uppgifter på både lokala och fjärranslutna Windows-system.

PowerShell är en ny racerplattform för automatisering, genom att det löser utmaningar för administration och anpassningsförmåga genom att seamlessly integrera .NET Framework. Det är bra för utvecklare, administratörer, testare och mer. Baserat på .NET, reducerar verktyget kostnaderna, samtidigt som utvecklare och administratörer får ett enkelt och företagsklart sätt att automatisera, mäta och förbättra alla sina processer.


Följ med

I denna intro markerar jag en del av djupet och bredden som PowerShell tar med sig till bordet. Saker som speländringsobjektet, REPL (läs, eval, utskriftsling), .NET integration och mer.

Om du kör Windows 7 eller 8, är PowerShell redan installerat. Ladda ner PowerShell v3 för Windows 7 här. Du behöver Windows 7 SP1 och nedladdningen fungerar också för Windows 2008 R2 SP1 och Windows 2008 SP2. Om du kör Vista, XP eller Windows 2003 måste du avgöra om PowerShell v2 här.


Vad är det bra för? Absolut allt!

Från att distribuera flera resurser till Azure, för att hantera din programvara bygger för kontinuerlig integrering, får du tillgång till webbtjänster eller REST-slutpunkter. PowerShell har du täckt och ger så mycket mer.

  • Skiva och tärningstext, XML, CSV och JSON med lätthet
  • Bädda in PowerShell för att tillhandahålla skriptfunktioner för dina C # -appar
  • Skapa GUI-applikationer fem till tio gånger snabbare med mindre kod
  • Utnyttja PowerShells möjligheter att arbeta med Internet
  • Interagera med DLL och skapa objekt, visa automatiskt egenskaper och samtalsmetoder i levande interaktiva sessioner
  • Bygg domänspecifika språk (DSL) och vokabulär för att uttrycka lösningar tydligare
  • Arbeta med Microsoft Office via komponentobjektmodellen (COM)
  • PowerShell v3-funktioner

Bootstrapping PowerShell

Vad är en cmdlet? En cmdlet är det grundläggande byggstenen i PowerShell och uttrycks som ett verb-substantivpar som hjälper till att göra dem självbeskrivande. Till exempel:

PS C: \> Get-Date söndag den 26 maj 2013 08:46:16

PowerShell innehåller hundratals kärn-cmdlets och du kan skriva din egen.

Memorera två cmdlets

PowerShell gör upptäckten lätt. När du går upp till den blå skärmen av PowerShell och är osäker på vad du ska göra, använd Get-Command.

De Get-Command cmdlet får alla kommandon som är installerade på datorn, inklusive cmdlets, alias, funktioner, arbetsflöden, filter, skript och program.

I huvudsak, Get-Command visar alla saker du kan göra i den aktuella PowerShell-sessionen.

Get-Command

Get-Command stöder jokertecken. Låt oss säga att jag vill se alla cmdlets som har verben, Åberopa?

Get-Command Invoke *

Här är vad jag får efter att ha tryckt stiga på.

CommandType Name ModuleName ----------- ---- ---------- Funktion Invoke-AsWorkflow PSWorkflowUtility Funktion Invoke-Background ShowUI Funktion Invoke-BrowserControl AutoBrowse Funktion Invoke-Line isepack Funktion Invoke -Line PowerShellPack Funktion Invoke-Office365 Pipeworks Funktion Invoke-Pester Pester Funktion Invoke-WebCommand Pipeworks Cmdlet Invoke-CimMethod CimCmdlets Cmdlet Invoke-Command Microsoft.PowerShell.Core Cmdlet Invoke-Expression Microsoft.PowerShell.Utility Cmdlet Invoke-History Microsoft.PowerShell.Core Cmdlet Invoke-Item Microsoft.PowerShell.Management Cmdlet Invoke-RestMethod Microsoft.PowerShell.Utility Cmdlet Invoke-FelsökningPack FelsökningPack Cmdlet Invoke-WebRequest Microsoft.PowerShell.Utility Cmdlet Invoke-WmiMethod Microsoft.PowerShell.Management Cmdlet Invoke-WSManAction Microsoft.WSMan.management

Vad är cmdletsna som slutar i substantivet?

Get-Command * -Item

Observera att du börjar se andra verb, som Clear, New, Remove and Set.

CommandType Name ModuleName ----------- ---- ---------- Cmdlet Clear-Item Microsoft.PowerShell.Management Cmdlet Kopiera-objekt Microsoft.PowerShell.Management Cmdlet Get-Item Microsoft.PowerShell.Management Cmdlet Invoke-objekt Microsoft.PowerShell.Management Cmdlet Flytta-objekt Microsoft.PowerShell.Management Cmdlet Nytt objekt Microsoft.PowerShell.Management Cmdlet Remove-Item Microsoft.PowerShell.Management Cmdlet Byt namn-objekt Microsoft.PowerShell.Management Cmdlet Set-Item Microsoft.PowerShell.Management

Nästa använder jag några cmdlets för att sammanfatta vad som är tillgängligt i min session i en av mina lådor när jag startar PowerShell-konsolen.

Get-Command | Gruppkommandotyp -NoElement | Sortera räkning -avvikande

Jag ringer Get-Command, gruppera det och sortera det. Här kan jag se att jag har 1000 + Cmdlets att arbeta med. Jag kör PowerShell v3 med ytterligare moduler installerade, så din körsträcka kan variera.

Räkning Namn ----- ---- 2487 Funktion 1184 Cmdlet 38 Alias ​​1 Filter

Vilka moduler kommer dessa cmdlets från? Vi kan svara på den här frågan på följande sätt:

Komma kommandot -CommandType Cmdlet | Gruppmodulnamn -NoElement | Sortera räkning -avvikande

Det finns mycket jag kan uppnå med PowerShell.

Count Name ----- ---- 379 ShowUI 164 Hyper-V 157 Azure 92 Microsoft.PowerShell.Utility 82 Microsoft.PowerShell.Management 78 Webadministration 55 Microsoft.PowerShell.Core 22 Dism 18 International 17 PKI 16 PSScheduledJob 13 Microsoft. WSMan.Management 12 CimCmdlets 10 Microsoft.PowerShell.Security 9 TrustedPlatformModule 8 BitsTransfer 8 MsDtc 6 Pipeworks 6 Kds 5 AppLocker 5 SecureBoot 5 Microsoft.PowerShell.Diagnostics 4 NetSecurity 4 Appx 3 WindowsErrorReporting 2 Microsoft.PowerShell.Host 2 Felsökningspaket 1 PSWorkflow 1 DnsClient

Få hjälp

Få hjälp gör precis det, det visar hjälp för cmdlet du är vad du ska veta mer om. Det är inte bara lätt att få hjälp, det är lätt att skapa / inkludera hjälp för de cmdlets / avancerade funktionerna du utvecklar, ett ämne för en annan artikel. Att ha hjälp vid dina fingertoppar är en stor tidsbesparare.

Get-Help Invoke-Command

Här är en Förkortad version av utgången.

NAME Get-Process SYNOPSIS Hämtar processerna som körs på den lokala datorn eller en fjärrdator. SYNTAX Get-Process [[-Name] ] [-Datornamn ] [-FileVersionInfo []] [-Module []] [] Get-Process [-ComputerName ] [-FileVersionInfo []] [-Module []] -Id  [] Get-Process [-ComputerName ] [-FileVersionInfo []] [-Module []] -InputObject  [] BESKRIVNING Get-Process cmdlet får processerna på en lokal eller fjärrdator ... 

Lättare fortfarande Det finns en omkopplare för detta på Get-Help cmdlet som tar dig hit.

Get-Help Get-Process-Online

Vill du bara se exempel på hur man använder cmdlet? Använd -exempel växla. Dessutom kan du kopiera och klistra in exempel direkt i konsolen och köra det.

Get-Help Get-Process-Exemplar

Det är så enkelt och snabbt.

NAME Get-Process SYNOPSIS Hämtar processerna som körs på den lokala datorn eller en fjärrdator. -------------------------- EXEMPEL 1 ---------------------- ---- PS C: \> Get-Process Det här kommandot får en lista över alla processer som körs på den lokala datorn. För en definition av varje kolumn, se avsnittet "Ytterligare anteckningar" i Hjälpämnet för Get-Help. -------------------------- EXEMPEL 2 ---------------------- ---- PS C: \> Get-Process winword, explorer | formatlista *

PowerShell fungerar enkelt med webbtjänster

W3C definierar en "webbtjänst" som:

[...] ett mjukvarusystem som är utformat för att stödja driftskompatibel maskin-till-maskin interaktion över ett nätverk. Den har ett gränssnitt som beskrivs i maskinframställningsformat (specifikt WSDL). Andra system interagerar med webbtjänsten på ett sätt som beskrivs av dess beskrivning med hjälp av SOAP-meddelanden, som typiskt förmedlas med hjälp av HTTP med en XML-serialisering i samband med andra webbrelaterade standarder.

PowerShell gör det snabba arbetet med Webservices, med hjälp av New-WebServiceProxy cmdlet. Ändra $ postnummer, kör det och få den senaste väderinformationen.

$ zipCode = "96826" $ svc = New-WebServiceProxy http://wsf.cdyne.com/WeatherWS/Weather.asmx $ result = $ svc.GetCityForecastByZIP ($ zipCode) # Omforma resultaten $ result.ForecastResult | ForEach [PSCustomObject] @ City = $ result.City State = $ result.State Date = $ _. Date.ToString ("d") Beskrivning = $ _. Beskrivning DaytimeHigh = $ _. TemperaturesDaytimeHigh

Resultat

Jag lagrar proxyobjektet i $ SVC och ring sedan till GetCityForecastByZIP metod, fånga resultaten i $ result. Looping genom arrayen ForecastResult, omvandlar jag posten på data. Observera att Stad och DaytimeHigh ligger på olika nivåer i hierarkin.

Tekniken jag använder skapar nyckel / värdepar för hashtabelen. @ är PowerShell-syntax för en ny hashtable. Använder sig av [PSCustomObject] är en PowerShell accelerator, vilket gör det möjligt för mig att skapa ett anpassat objekt från en hashtable.

De Weather.asmx webbtjänst returnerade hierarkisk XML. I en handfull PowerShell-kommandon formaterade jag dataen och formaterade den (Datumet) enligt min smak. För det här exemplet valde jag att låta PowerShell skriva ut det. När jag har data i min PowerShell-session är jag nu ansluten till PowerShells ekosystem och kan enkelt leda denna serie anpassade objekt till andra cmdlets för att driva den till en annan webbtjänst, skapa HTML, spara den till en fil, skapa en CSV fil eller exportera den till en SQL-databas.

Stadsstat Datum Beskrivning DagtidHigh ---- ----- ---- ----------- ----------- Honolulu HI 5/22/2013 Duschar 76 Honolulu HI 5/23/2013 Delvis molnigt 76 Honolulu HI 5/24/2013 Delvis molnigt 77 Honolulu HI 5/25/2013 Delvis molnigt 77 Honolulu HI 5/26/2013 Delvis molnigt 77 Honolulu HI 5/27/2013 Delvis molnigt 77 Honolulu HI 5/28/2013 Delvis molnigt 77

Arbetar med CSV, JSON och XML

Textformat för skivning och textning är en PowerShell-sötpunkt. Här konverterar jag tre vanliga format till ett PowerShell-objekt. För CSV och JSON använder jag rätt ConvertFrom- * cmdlets, och för XML använder jag accelerator som tar XML och skapar ett XMLDocument.

# Använd CSV $ csv = "Name, Age'r'nJohn, 10" | ConvertFrom-Csv $ csv Namn Ålder ---- --- John 10 # Använd JSON $ json = "Namn:" Tom ", Ålder: 20" | ConvertFrom-Json $ json Namn Ålder ---- --- Tom 20 # Använd XML $ xml = ([xml] [/ xml] "Harry30") .data.record $ xml Namn Ålder ---- --- Harry 30 # Kombinera alla tre $ csv, $ json, $ xml Namn Ålder ---- --- John 10 Tom 20 Harry 30 # Lägg upp åldrar $ csv, $ json, $ xml |% $ sum = 0 $ sum + = $ _. ålder $ sum 60

Så vi tog tre heterogena format och gjorde i slutet en aggregering över ett av fälten. Jag kunde ha hämtat alla dessa data från olika ställen, Dela CSV från ett nätverk, JSON för en REST-fråga och XML från en webbtjänst. Som sagt, det här är en PowerShell sötplats.


Twitter Search

Låt oss använda Twitters sök REST API på kommandoraden. Jag konstruerar Url, som du kan använda i din webbläsare, och sedan använder jag PowerShell cmdlet Åberopa-RestMethod. Den skickar en begäran till REST-tjänsten och bestämmer om svaret är XML eller JSON. Här begär jag ett JSON-svar så, Åberopa-RestMethod konverterar resultaten till en rad PowerShell-objekt. Jag rör dem till Välj cmdlet (ett alias av verb-substantivet Select-Object) väljer att bara tre fält. Tänk på detta som en projicering, som liknar LINQ eller SQL.

$ query = "PowerShell" $ url = "http://search.twitter.com/search.json?q=$query" (Invoke-RestMethod $ url) .resultat | Välj created_at, from_user_name, text

Resultat

Det är så enkelt. Kolla in en video som jag gjorde för version 2: "PowerShell, ShowUI och Twitter API". En mini WPF Twitter app i handfull PowerShell.

created_at from_user_name text ---------- -------------- ---- lör, 25 maj 2013 vitor pombeiro @brunomlopes a falar sobre Powershell "i minha maneira" lör , 25 maj 2013 Jeffery Hicks Visste du att #PowerShell ISE har startalternativ? I lördag 25 maj 2013 Pat Richard @ mwjcomputing Ja - hade alltid använt $ MyInvocation.MyCom lör, 25 maj 2013 Rob Fairman "#PowerShell Script for Clearing #Windows Event Logs" ht lör, 25 maj 2013 Jim Priestley Automating SharePoint Deployments i Windows #Azure usin lör, 25 maj 2013 VT Technology RT @jangwoo_park: @ VTTechnology: Exportera flera Virtua lör, 25 maj 2013 Aryan Nava Använda PowerShell för att visa Webbplats skapad den tidigare da lör, 25 maj 2013 Aryan Nava PowerShell Tips för SQL Server http://t.co/lVW2AY5BYZ Lör, 25 maj 2013 Privat Cloud Tech Resan till Privat Cloud Del 3 - Infrastruc lör, 25 maj 2013 Dr Tom Shinder Resan till Privat Cloud Del 3 â € " "Infrastruc Sat, 25 maj 2013 Jacob Daniels RT @tech_faq: Windows Server Manager är baserad på Windows Sat, 25 maj 2013 CodeCruiser 10 Tips för SQL Server PowerShell Scripter http: // t.

Kompilerar C # på flyget i PowerShell

PowerShell är ett tolkat språk. Så det kommer att bli en straff. Det är inte ett stort problem, men ibland behöver du hastigheten på ett sammanställt språk. PowerShell låter dig kompilera C # i flygningen i minnet i din PowerShell-session, med hjälp av -TypeDefinition parameter på Add-Type cmdlet. Notera här-string identifieras av @ "" @. De är super användbara när du citerar text. Jag uppmuntrar dig att utforska mer med Add-Type och PowerShells citatregler.

Add-Type -TypeDefinition @ "public class TestInline public long Fibonacci (long n) long a = 0; lång b = 1; för (lång idx = 0; idx < n; idx+=1)  long temp = a; a = b; b = temp + b;  return a;   "@ $obj = New-Object TestInline 1… 10 | ForEach  $obj.Fibonacci($_) 

Samverkar med DLLS

Nu, låt oss säga att jag inte gav dig källkoden - bara den sammanställda DLL. Inga problem: Add-Type har en -Väg parameter.

Add-Type -Path. \ FibLib.dll $ obj = Testobjekt för nytt objekt 1 ... 10 | ForEach $ obj.Fibonacci ($ _)

Var särskilt uppmärksam på detta. Använder sig av Add-Type På så sätt kan du enkelt byta alla. NET DLL-filer från någon, om de inte redan har tillhandahållit ett PowerShell-gränssnitt. Detta är sant om DLL är från Microsoft, DELL, Citrix eller annan utvecklare.


I stängning

Så det gör det för nu. Vill du se mer Powershell-specifikt innehåll på Nettuts +? Låt oss veta nedan!