Zeg hallo tegen PowerShell

PowerShell is al meer dan tien jaar in ontwikkeling. Microsoft blijft investeren in de ontwikkeling en acceptatie ervan. Deze investeringen hebben het gemak en de robuustheid veranderd waarmee ontwikkelaars en beheerders Windows-taken kunnen automatiseren.


Wat is PowerShell?

PowerShell lost de uitdagingen op het gebied van beheer en aanpasbaarheid op door naadloos het .NET Framework te integreren.

PowerShell is Microsoft's taakautomatiseringsraamwerk, bestaande uit een commandoregel-shell, een geïntegreerde scriptingomgeving (ISE), een scriptingtaal gebouwd op .NET Framework, een API waarmee u PowerShell in uw .NET-toepassingen kunt hosten en het is een gedistribueerde automatiseringsplatform. PowerShell biedt volledige toegang tot COM en WMI, zodat u taken op zowel lokale als externe Windows-systemen kunt uitvoeren.

PowerShell is een nieuw rassenplatform voor automatisering, omdat het oplossingen voor administratie en aanpassingsvermogen oplost door naadloos het .NET Framework te integreren. Het is goed voor ontwikkelaars, beheerders, testers en meer. Op basis van .NET verlaagt de tool de kosten en biedt ontwikkelaars en beheerders een eenvoudige en bedrijfsgereed manier om al hun processen te automatiseren, meten en verbeteren..


Volgen

In deze intro belicht ik enkele van de diepte en de breedte die PowerShell naar de tafel brengt. Dingen zoals de pijplijn voor het veranderen van objecten, de REPL (lezen, eval, printlus), .NET-integratie en meer.

Als u Windows 7 of 8 gebruikt, is PowerShell al geïnstalleerd. Download hier PowerShell v3 voor Windows 7. U hebt Windows 7 SP1 nodig en de download werkt ook voor Windows 2008 R2 SP1 en Windows 2008 SP2. Als u Vista, XP of Windows 2003 gebruikt, moet u hier genoegen nemen met PowerShell v2.


Waar is het goed voor? Absoluut alles!

Van het inzetten van meerdere bronnen tot Azure, tot het verwerken van uw softwarepakketten voor continue integratie, toegang tot webservices of REST-eindpunten. PowerShell heeft u gedekt en biedt zoveel meer.

  • Snijd en dobbel tekst, XML, CSV en JSON met gemak
  • Sluit PowerShell in om scriptingmogelijkheden voor uw C # -apps te bieden
  • Maak GUI-applicaties vijf tot tien keer sneller met minder code
  • Maak gebruik van de mogelijkheden van PowerShell om met internet te werken
  • Communiceer met DLL's en maak objecten, toon automatisch eigenschappen en belmethoden in live interactieve sessies
  • Bouw domein-specifieke talen (DSL's) en vocabulaires om oplossingen duidelijker uit te drukken
  • Werk met Microsoft Office via het Component Object Model (COM)
  • PowerShell v3-functies

Bootstrapping PowerShell

Wat is een cmdlet? Een cmdlet is de fundamentele bouwsteen in PowerShell en wordt uitgedrukt als een werkwoord-noun-paar, waardoor ze zelfbeschrijvend worden. Bijvoorbeeld:

PS C: \> Get-date zondag 26 mei 2013 8:46:16 AM

PowerShell bevat honderden kern-cmdlets en u kunt er zelf een maken.

Onthoud twee cmdlets

PowerShell maakt ontdekbaarheid eenvoudig. Wanneer u naar het blauwe scherm van PowerShell loopt en niet zeker weet wat u moet doen, gebruik dan Get-Command.

De Get-Command cmdlet krijgt alle opdrachten die op de computer zijn geïnstalleerd, inclusief cmdlets, aliassen, functies, werkstromen, filters, scripts en toepassingen.

In essentie, Get-Command toont u alle dingen die u kunt doen in de huidige PowerShell-sessie.

Get-Command

Get-Command ondersteunt jokertekens. Laten we zeggen dat ik alle cmdlets met het werkwoord wil zien, Beroep doen op?

Get-Command Invoke *

Dit is wat ik krijg nadat ik heb gedrukt invoeren.

CommandType Naam ModuleName ----------- ---- ---------- Functie Invoke-AsWorkflow PSWorkflowUtility Functie Invoke-Background ShowUI-functie Invoke-BrowserControl AutoBrowse-functie Invoke-Line isepack-functie Invoke -Line PowerShellPack Functie Invoke-Office365 Pipeworks Functie Invoke-Pester Pester Functie 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-TroubleshootingPack Problemen oplossenPack Cmdlet Invoke-WebRequest Microsoft.PowerShell.Utility Cmdlet Invoke-WmiMethod Microsoft.PowerShell.Management Cmdlet Invoke-WSManAction Microsoft.WSMan.Management

Wat zijn de cmdlets die eindigen op het zelfstandig naamwoord Item?

Get-Command * -artikel

Merk op dat je andere werkwoorden begint te zien, zoals Wissen, Nieuw, Verwijderen en Instellen.

CommandType Name ModuleName ----------- ---- ---------- Cmdlet Clear-Item Microsoft.PowerShell.Management Cmdlet Copy-Item Microsoft.PowerShell.Management Cmdlet Get-Item Microsoft.PowerShell.Management Cmdlet Invoke-Item Microsoft.PowerShell.Management Cmdlet Move-Item Microsoft.PowerShell.Management Cmdlet New-Item Microsoft.PowerShell.Management Cmdlet Remove-Item Microsoft.PowerShell.Management Cmdlet Hernoemen Item Microsoft.PowerShell.Management Cmdlet Set-Item Microsoft.PowerShell.Management

Vervolgens gebruik ik een paar cmdlets om samen te vatten wat er beschikbaar is in mijn sessie op een van mijn boxes wanneer ik de PowerShell-console start.

Get-Command | Group CommandType -NoElement | Sorteeraantal - aflopend

ik bel Get-Command, groepeer het en sorteer het. Hier zie ik dat ik meer dan 1000 cmdlets heb om mee te werken. Ik gebruik PowerShell v3 met extra modules geïnstalleerd, zodat je kilometers kunnen variëren.

Count Name ----- ---- 2487 Functie 1184 Cmdlet 38 Alias ​​1 Filter

Van welke modules komen deze cmdlets? We kunnen die vraag als volgt beantwoorden:

Get-Command -CommandType Cmdlet | Group ModuleName -NoElement | Sorteeraantal - aflopend

Er is veel dat ik kan bereiken met 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 Problemen oplossenPack 1 PSWorkflow 1 DnsClient

Krijg hulp

Krijg hulp doet precies dat, het geeft hulp voor de cmdlet waar je meer over te weten bent. Het is niet alleen gemakkelijk om hulp te krijgen, het is gemakkelijk om hulp te creëren / opnemen voor de cmdlets / geavanceerde functies die u ontwikkelt, een onderwerp voor een ander artikel. Hulp bij uw vingertoppen is een enorme tijdbesparing.

Get-Help Invoke-Command

Hier is een verkorte versie van de uitvoer.

NAME Get-Process SYNOPSIS Hiermee worden de processen opgehaald die worden uitgevoerd op de lokale computer of op een externe computer. SYNTAX Get-Process [[-Name] ] [-Computer naam ] [-FileVersionInfo []] [-Module []] [] Get-Process [-ComputerName ] [-FileVersionInfo []] [-Module []] -ID kaart  [] Get-Process [-ComputerName ] [-FileVersionInfo []] [-Module []] -InputObject  [] BESCHRIJVING De cmdlet Get-Process haalt de processen op een lokale of externe computer ... 

Gemakkelijker nog; er is een omschakeling hiervoor op de Get-Help cmdlet die je hier naartoe brengt.

Get-Help Get-Process -Online

Wilt u alleen voorbeelden zien van het gebruik van de cmdlet? Gebruik de -Voorbeelden schakelaar. Bovendien kunt u dit voorbeeld rechtstreeks in de console kopiëren en plakken en uitvoeren.

Get-Help Get-Process -Voorbeelden

Het is zo gemakkelijk en snel.

NAME Get-Process SYNOPSIS Hiermee worden de processen opgehaald die worden uitgevoerd op de lokale computer of op een externe computer. -------------------------- VOORBEELD 1 ---------------------- ---- PS C: \> Get-Process Deze opdracht krijgt een lijst met alle actieve processen die op de lokale computer worden uitgevoerd. Zie het gedeelte "Aanvullende opmerkingen" van het Help-onderwerp voor Get-Help voor een definitie van elke kolom. -------------------------- VOORBEELD 2 ---------------------- ---- PS C: \> Get-Process winword, explorer | formaatlijst *

PowerShell werkt eenvoudig met webservices

De W3C definieert een "Webservice" als:

[...] een softwaresysteem ontworpen om interoperabele machine-naar-machine-interactie via een netwerk te ondersteunen. Het heeft een interface die wordt beschreven in een machinaal verwerkbaar formaat (met name WSDL). Andere systemen communiceren met de webservice op een manier die wordt voorgeschreven door de beschrijving ervan met behulp van SOAP-berichten, meestal overgebracht met HTTP met een XML-serialisatie in combinatie met andere webgerelateerde standaarden.

PowerShell maakt snel werk van Webservices, met behulp van de Nieuw-WebServiceProxy cmdlet. Verander de $ postcode, voer het uit en ontvang de laatste weerinformatie.

$ zipCode = "96826" $ svc = New-WebServiceProxy http://wsf.cdyne.com/WeatherWS/Weather.asmx $ result = $ svc.GetCityForecastByZIP ($ zipCode) # Transformeer de resultaten $ result.ForecastResult | VoorElke [PSCustomObject] @ City = $ result.City State = $ result.State Date = $ _. Date.ToString ("d") Description = $ _. Desciption DaytimeHigh = $ _. Temperatures.DaytimeHigh

Resultaat

Ik bewaar het proxy-object in $ svc en bel dan de GetCityForecastByZIP methode, de resultaten vastleggen $ result. Doorloop de reeks ForecastResult en transformeer de record op de gegevens. Merk op dat de stad en DaytimeHigh bevinden zich op verschillende niveaus in de hiërarchie.

De techniek die ik gebruik, is het maken van sleutel / waarde-paren voor de hash-tabel. @ is de PowerShell-syntaxis voor een nieuwe hashtabel. Gebruik makend van [PSCustomObject] is een PowerShell versneller, waarmee ik enerzijds een aangepast object kan maken vanuit een hashtabel.

De Weather.asmx webservice geretourneerde hiërarchische XML. In een handvol PowerShell-opdrachten heb ik de gegevens opnieuw gevormd en naar wens opgemaakt (de Date). Voor dit voorbeeld heb ik ervoor gekozen om PowerShell door te laten printen. Zodra ik de gegevens in mijn PowerShell-sessie heb, ben ik nu verbonden met het PowerShell-ecosysteem en kan ik deze array met aangepaste objecten eenvoudig naar andere cmdlets doorsturen om deze naar een andere webservice te pushen, HTML te genereren, in een bestand op te slaan, een CSV te maken bestand of exporteer het naar een SQL-database.

Stadstaat Datum Beschrijving Overdag Hoog ---- ----- ---- ----------- ----------- Honolulu HI 5/22/2013 Douches 76 Honolulu Hl 5-5-2013 Gedeeltelijk bewolkt 76 Honolulu HI 24-5-2013 Gedeeltelijk bewolkt 77 Honolulu HI 25-5-2013 Gedeeltelijk bewolkt 77 Honolulu HI 26-5-2013 Gedeeltelijk bewolkt 77 Honolulu HI 27-5-2013 Gedeeltelijk bewolkt 77 Honolulu HI 28-5-2013 Gedeeltelijk bewolkt 77

Werken met CSV, JSON en XML

Tekstformaten voor het opsnijden en in stukken snijden is een PowerShell-snoepje. Hier converteer ik drie veelgebruikte indelingen naar een PowerShell-object. Voor CSV en JSON gebruik ik het goede ConvertFrom- * cmdlets, en voor de XML gebruik ik de accelerator die XML neemt en een XMLDocument maakt.

# Gebruik CSV $ csv = "Naam, Leeftijd'r'nJohn, 10" | ConvertFrom-Csv $ csv Naam Leeftijd ---- --- John 10 # Gebruik JSON $ json = "Naam: 'Tom', Leeftijd: 20" | ConvertFrom-Json $ json Naam Leeftijd ---- --- Tom 20 # Gebruik XML $ xml = ([xml] [/ xml] "Harry30") .data.record $ xml Naam Leeftijd ---- --- Harry 30 # Combineer alle drie $ csv, $ json, $ xml Naam Leeftijd ---- --- John 10 Tom 20 Harry 30 # Tel de leeftijden $ csv, $ json, $ xml |% $ sum = 0 $ sum + = $ _. age $ sum 60

We hebben dus drie heterogene indelingen gemaakt en aan het eind een aggregatie uitgevoerd op een van de velden. Ik had elk van deze datafeeds op verschillende plaatsen kunnen ophalen, de CSV van een netwerkshare, de JSON voor een REST-query en de XML van een webservice. Zoals ik al zei, dit is een PowerShell-snoepje.


Twitter zoeken

Laten we de REST API van Twitter op de opdrachtregel gebruiken. Ik maak de URL, die je zou kunnen gebruiken in je browser, en dan gebruik ik de PowerShell-cmdlet Roep-RestMethod. Het verzendt een verzoek naar de REST-service en bepaalt of het antwoord XML of JSON is. Hier vraag ik een JSON-antwoord dus, Roep-RestMethod converteert de resultaten naar een reeks PowerShell-objecten. Ik pijp ze naar de kiezen cmdlet (een alias van het werkwoord-zelfstandig naamwoord Select-Object) kiezen voor slechts drie velden. Zie dit als een projectie, vergelijkbaar met LINQ of SQL.

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

Resultaat

Het is zo makkelijk. Bekijk een video die ik heb gedaan voor versie 2: "PowerShell, ShowUI en de Twitter API". Een mini WPF Twitter-app in een handvol van PowerShell.

created_at from_user_name text ---------- -------------- ---- za, 25 mei 2013 vitor pombeiro @brunomlopes a falar sobre Powershell "à minha maneira" za , 25 mei 2013 Jeffery Hicks Wist je dat de #PowerShell ISE opstartopties heeft? In za, 25 mei 2013 heeft Pat Richard @mwjcomputing Yeah - altijd $ MyInvocation gebruikt. MyCom zat, 25 mei 2013 Rob Fairman "#PowerShell Script voor het opruimen #Windows Event Logs" ht zat, 25 mei 2013 Jim Priestley Automatiseren van SharePoint-implementaties in Windows #Azure usin zat, 25 mei 2013 VT Technology RT @jangwoo_park: â € œ @ VTTechnology: Export Multiple Virtua za, 25 mei 2013 Aryan Nava PowerShell gebruiken om Site te bekijken gemaakt op de vorige dag za., 25 mei 2013 Aryan Nava PowerShell Tips voor SQL Server http://t.co/lVW2AY5BYZ za, 25 mei 2013 Private Cloud Tech The Journey to the Private Cloud Deel 3 â € "The Infrastruc Sat, 25 mei 2013 Dr. Tom Shinder De reis naar de private cloud deel 3 â € "The Infrastruc Sat, 25 mei 2013 Jacob Daniels RT @tech_faq: Windows Server Manager is gebaseerd op Windows Sat, 25 mei 2013 CodeCruiser 10 Tips voor de SQL Server PowerShell Scripter http: // t.

Compilatie C # on the fly in PowerShell

PowerShell is een geïnterpreteerde taal. Dus er zal een boete zijn. Het is geen grote zorg, maar soms heb je de snelheid van een gecompileerde taal nodig. Met PowerShell kunt u C # direct in het geheugen in uw PowerShell-sessie compileren met behulp van de -TypeDefinition parameter op de Add-Type cmdlet. Merk op hier-string geïdentificeerd door de @ "" @. Ze zijn super handig bij het citeren van tekst. Ik moedig je aan om meer te verkennen met Add-Type en citeerregels van PowerShell.

Add-Type -TypeDefinition @ "public class TestInline public long Fibonacci (long n) long a = 0; long b = 1; for (long 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($_) 

Interactie met DLLS

Laten we zeggen dat ik je de broncode niet heb gegeven - alleen de gecompileerde DLL. Geen probleem: Add-Type heeft een -Pad parameter.

Add-Type -Path. \ FibLib.dll $ obj = Nieuw-Object TestInline 1 ... 10 | Voor nog $ obj.Fibonacci ($ _)

Besteed hier bijzondere aandacht aan. Gebruik makend van Add-Type Op deze manier kunt u gemakkelijk elke .NET DLL van iemand overnemen, als deze nog geen PowerShell-interface heeft geleverd. Dit is waar of de DLL van Microsoft, DELL, Citrix of een andere ontwikkelaar is.


In Closing

Dus dat doet het voor nu. Wilt u meer Powershell-specifieke inhoud zien op Nettuts +? Laat het ons hieronder weten!