PowerShell Power, del 2

I del ett visade jag dig några coola saker du kan göra med PowerShell, täckte PowerShells historia och utforskade djupt PowerShells möjligheter som ett starkt skriptspråk som stöder procedur, funktionell och objektorienterad programmering. 

I del två ska jag diskutera det interaktiva skalet, profilen och prompten, och jag ska jämföra PowerShell till Bash.

PowerShell: Interactive Shell

PowerShell designades från get-go som ett interaktivt skal för Windows-systemansvariga och strömanvändare. Det fokuserar på ett litet antal koncept, mycket konsekvent erfarenhet och en objektpipeline för att kedja och kombinera kommandon, filtrera dem och formatera dem. Dess starka hjälpsystem, som också följer ett konsekvent format, är ett nöje att använda.

Låt oss se lite av det i åtgärd.

Få hjälp

Det omfattande hjälpsystemet är tillgängligt via Få hjälp.

PS C: \ WINDOWS \ system32> Hjälp Invoke-WebRequest NAME Invoke-WebRequest SYNOPSIS Hämtar innehåll från en webbsida på Internet. SYNTAX Invoke-WebRequest [-Uri]  [-Kropp ] [-Certifikat ] [-CertificateThumbprint ] [-Innehållstyp ] [-Credential ] [-DisableKeepAlive] [-Headers ] [-InFile ] [-MaximumRedirection ] [-Method Default | Få | Huvud | Post | Put | Ta bort | Spår | Alternativ | Sammanfoga | Patch] [-OutFile ] [-PassThru] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-SessionVariable ] [-TimeoutSec ] [-TransferEncoding chunked | komprimera | deflate | gzip | identitet] [-UseBasicParsing] [-Utvänd standardCredentials] [-UserAgent ] [-WebSession ] [] BESKRIVNING cmvletet Invoke-WebRequest skickar HTTP-, HTTPS-, FTP- och FILE-förfrågningar till en webbsida eller webbtjänst. Den analyserar svaret och returnerar samlingar av formulär, länkar, bilder och andra viktiga HTML-element. Denna cmdlet introducerades i Windows PowerShell 3.0. RELATERADE LÄNKAR Onlineversion: http://go.microsoft.com/fwlink/?LinkId=821826 Invoke-RestMethod ConvertFrom-Json ConvertTo-Json ANMÄRKNINGAR För att se exemplen skriver du: "get-help Invoke-WebRequest -examples". För mer information, skriv: "get-help Invoke-WebRequest -detailed". För teknisk information, skriv: "get-help Invoke-WebRequest -full". För onlinehjälp, skriv: "get-help Invoke-WebRequest -online"

För att få mer detaljerad hjälp och se exempel, använd de korrekta omkopplarna: -exempel, -detaljer, eller -full.

Om du inte är säker på vad kommandonamnet är, använd bara nyckelord och PowerShell visar alla tillgängliga kommandon som innehåller det här sökordet. Låt oss se vilka cmdlets som är relaterade till CSV är tillgängliga:

PS C: \ Användare \ the_g> Get-Help -Category Cmdlet csv | välj namn Namn ---- ConvertFrom-Csv ConvertTo-Csv Export-Csv Import-Csv 

Jag skapade en liten pipeline där jag begränsade Get-Help-samtalet bara till kategorin Cmdlet och ledde sedan det till "select" (alias för Select-Object) för att bara få namnet "property".

Arbeta med filer och kataloger

Du kan göra ganska mycket allt du är van att: navigera till olika kataloger, listfiler och underkataloger, granska innehållet i filer, skapa kataloger och filer, etc..

PS C: \ Users \ the_g> mkdir test_dir | välj namn Namn ---- test_dir PS C: \ Användare \ the_g> cd. \ test_dir PS C: \ Användare \ the_g \ test_dir> "123"> test.txt PS C: \ Användare \ the_g \ test_dir> ls | namn Namn ---- test.txt PS C: \ Användare \ the_g \ test_dir> get-content. \ test.txt 123

Arbeta med andra leverantörer

Med PowerShell kan du behandla många saker som filsystem och navigera dem med CD och kontrollera innehållet med ls / dir. Här är några ytterligare leverantörer:

Provider Drive Data Store -------- ----- ---------- Alias ​​Alias: Windows PowerShell-alias Certifikatcertifiering: x509-certifikat för digitala signaturer Miljö Env: Windows-miljövariabler Funktionsfunktion: Windows PowerShell funktioner Registry HKLM :, HKCU: Windows-registret Variabelvariabel: Windows PowerShell-variabler WSMan WSMan: WS-Management-konfigurationsinformation 

Låt oss kolla miljön och se vilka Go-relaterade miljövariabler finns där ute (på min maskin):

PS C: \ Användare \ the_g> ls env: GO * Namn Värde ---- ----- GOROOT C: \ GO \ GOPATH C: \ Användare \ the_g \ Documents \ Go 

formatering

PowerShell uppmuntrar att komponera cmdlets med standardbrytare och skapa pipelines. Formatering är ett uttryckligt koncept där du i slutet av en pipeline lägger en formaterare. PowerShell undersöker som standard typen av objekt eller objekt i slutet av röret och tillämpar en standardformaterare. Men du kan åsidosätta det genom att ange en formaterare själv. Formateringar är bara cmdlets. Här är den tidigare utmatningen som visas i listformat:

PS C: \ Användare \ the_g> ls env: GO * | Format-List Name: GOROOT Värde: C: \ Go \ Name: GOPATH Värde: c: \ Användare \ the_g \ Documents \ Go 

Profilen

Kraftanvändare som ofta använder kommandoraden har många uppgifter, pipelines och favoritkombinationer av kommandon med standardväxlar som de föredrar. PowerShell-profilen är en PowerShell-skriptfil som laddas och körs när du startar en ny session. Du kan lägga alla dina favoritgodis där, skapa aliaser och funktioner, ställa in miljövariabler och nästan allt annat.

Jag gillar att skapa navigeringsalias till djupt kapslade kataloger, aktivera virtuella Python-miljöer och skapa genvägar till externa kommandon som jag kör ofta, som git och docker.

För mig är profilen oumbärlig eftersom PowerShells läsliga och konsekventa kommandon och omkopplare ofta är för stora och de inbyggda aliaserna är ofta mer problem än hjälp (jag diskuterar detta senare). Här är ett mycket partiellt utdrag ur min profil:

# --------------------------- # # DOCKER # # ----------------- ---------- Set-Alias ​​-Name d -Value dockerfunktionen di d bilder # ------------------------ --- # # GIT # # --------------------------- Set-alias -Name g -Value git-funktionen gs g status funktion gpu g pull --rebase # ------------------------- # # CONDA # # ---------- --------------- funktion a activate.ps1 $ args [0] # ---------------------- - # # NAVIGATION # # ------------------------ funktion cdg cd $ github_dir # MVP funktion cdm a ov; cdg; cd MVP # backend-funktion cdb a ov; cdg; cd backend # scratch function cd-skivor a ov; cdg; cd-skrapa # backend-paketfunktioner cdbp cdb; cd-paket # Gå på arbetsområdet cdgo cd $ go_src_dir

Frågan 

PowerShell låter dig anpassa kommandotolken. Du måste definiera en funktion som heter prompt(). Du kan se den inbyggda snabbfunktionen:

PS C: \ Användare \ the_g> gc funktion: prompt "PS $ ($ executionContext.SessionState.Path.CurrentLocation) $ ('>' * ($ nestedPromptLevel + 1))"; # .Link # http://go.microsoft.com/fwlink/?LinkID=225750 # .ExternalHelp System.Management.Automation.dll-help.xml PS C: \ Användare \ the_g> 

Här är en anpassad snabbfunktion som visar aktuell tid utöver den aktuella katalogen:

PS C: \ Users \ the_g> funktionsprompten "$ (get-date) $ (get-location)>"

10/09/2016 12:42:36 C: \ Users \ the_g> 

Du kan naturligtvis gå vild och lägga till färger och kontrollera olika förhållanden som om du är i ett visst gitförteckning eller om du är administratör.

Aliaser: Den mörka sidan

PowerShell fick fel, enligt min mening, på två separata fronter. Först, det alias kommandot tillåter bara att byta namn på kommandon. Du kan inte lägga till vanliga flaggor eller alternativ för att göra kommandon mer användbara genom att aliasing dem till sig själva.

Om du till exempel vill söka i textrad efter rad kan du använda Välj-String cmdlet:

# Skapa en liten textfil med 3 rader "@ ab cd ef @"> 1.txt # Sök efter en rad som innehåller d Get-Content 1.txt | Select-String d cd

Det fungerar, men många skulle vilja byta namn Välj-String till grep. Men grep är som standard skiftlägeskänslig medan Välj-String är inte. Ingen stor sak - vi lägger bara till -Skiftlägeskänsliga flagga, som i:

Set-alias -Name grep -Value "Select-String -Case Sensitive" 

Tyvärr fungerar det inte:

16:19:26 C: \ Users \ the_g> Get-Content 1.txt | grep D grep: Termen 'Select-String -Case Sensitive' känns inte igen som namnet på en cmdlet, funktion, skriptfil eller operativt program. Kontrollera stavningen av namnet, eller om en sökväg var med, kontrollera att sökvägen är korrekt och försök igen. På rad: 1 char: 21 + Get-Content 1.txt | grep D + ~~~~ + CategoryInfo: ObjectNotFound: (Select-String -CaseSensitive: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException 

Värdet av ett alias måste vara antingen en cmdlet, en funktion, ett manus eller ett program. Inga flaggor eller argument är tillåtna. 

Nu kan du göra det mycket enkelt i PowerShell, men du måste använda funktioner och inte alias. Det begränsar ganska mycket alias till enkel omdämning, vilket också kan göras av funktioner.

PowerShell vs Bash

På den interaktiva skalsidan är PowerShell och Bash ganska lika. Bash är mer koncis som standard, men PowerShells objektrörledning gör komplicerade rörledningar mer hanterbara. ,

Med det sagt kan du förmodligen uppnå någonting med någon och om du är en maktanvändare har du egna aliaser, funktioner och genvägar för vanliga uppgifter. På skriptsidan går PowerShell långt bortom Bash, och för systemadministrationsändamål slår det till och med Python, Ruby och vänner. 

En viktig aspekt är tillgängligheten. Bash kommer förinstallerat med de flesta * nix-distributioner (om inte specifikt strippas) inklusive macOS. Det kan också installeras på Windows via cygwin, git-bash eller msys. PowerShell kommer förinstallerad på Windows och blev nyligen tillgänglig på Mac och Linux.

Slutsats

Om du använder Windows som en utvecklingsmaskin eller om du hanterar Windows-maskiner är PowerShell ett oumbärligt verktyg. Det är verkligen en väl genomtänkt superset av Unix-skalen, och den kommer förinstallerad. 

PowerShell är bra programvaruteknik på jobbet. Det utvecklades under ett decennium, och det var innovativt samtidigt som man behöll sin ursprungliga konceptuella integritet. Den senaste omställningen till öppen källkod och plattform signalerar att det fortfarande finns mycket mer att vänta på.