PowerShell Power, del 2

I del ett viste jeg deg noen kule ting du kan gjøre med PowerShell, dekket historien til PowerShell, og utforsket i dybden mulighetene til PowerShell som et sterkt skriptspråk som støtter prosessorisk, funksjonell og objektorientert programmering. 

I del to diskuterer jeg det interaktive skallet, profilen og spørringen, og jeg sammenligner PowerShell med Bash.

PowerShell: Interactive Shell

PowerShell ble designet fra get-go som et interaktivt skall for Windows sys admins og strømbrukere. Det fokuserer på et lite antall konsepter, veldig konsekvent erfaring, og en objektrørledning for å kjede og kombinere kommandoer, filtrere dem og formater dem. Dens sterke hjelpesystem, som også overholder et konsistent format, er en glede å bruke.

La oss se noe av det i aksjon.

Får hjelp

Det omfattende hjelpesystemet er tilgjengelig gjennom Få hjelp.

PS C: \ WINDOWS \ system32> Hjelp Invoke-WebRequest NAME Invoke-WebRequest SYNOPSIS Går innhold fra en nettside på Internett. SYNTAX Invoke-WebRequest [-Uri]  [-Kropp ] [-Certificate ] [-CertificateThumbprint ] [-Innholdstype ] [-Credential ] [-DisableKeepAlive] [-Headers ] [-InFile ] [-MaximumRedirection ] [-Method Standard | Få | Hodet | Innlegg | Put | Slett | Spor | Alternativer | Merge | Patch] [-OutFile ] [-PassThru] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-SessionVariable ] [-TimeoutSec ] [-TransferEncoding chunked | komprimere | deflate | gzip | identitet] [-UseBasicParsing] [-UseDefaultCredentials] [-UserAgent ] [-WebSession ] [] BESKRIVELSE cmvletet Invoke-WebRequest sender HTTP-, HTTPS-, FTP- og FILE-forespørsler til en nettside eller webtjeneste. Den analyserer svaret og returnerer samlinger av skjemaer, linker, bilder og andre viktige HTML-elementer. Denne cmdlet ble introdusert i Windows PowerShell 3.0. RELATERTE LINKER Online Versjon: http://go.microsoft.com/fwlink/?LinkId=821826 Invoke-RestMethod ConvertFrom-Json ConvertTo-Json ANMERKNINGER For å se eksemplene, skriv inn: "get-help Invoke-WebRequest -examples". For mer informasjon skriv inn: "get-help Invoke-WebRequest -detailed". For teknisk informasjon skriv inn: "get-help Invoke-WebRequest -full". For online hjelp, skriv inn: "get-help Invoke-WebRequest-online"

For å få mer detaljert hjelp og se eksempler, bruk de riktige bryterne: -eksempler, -detaljer, eller -full.

Hvis du ikke er sikker på hva kommandoenavnet er, bruk bare søkeord og PowerShell vil vise deg alle tilgjengelige kommandoer som inneholder dette søkeordet. La oss se hvilke cmdlets relatert til CSV er tilgjengelige:

PS C: \ Brukere \ the_g> Get-Help -Category Cmdlet csv | velg navn Navn ---- ConvertFrom-CSV ConvertTo-CSV Export-CSV Import-CSV 

Jeg opprettet en liten rørledning der jeg begrenset Get-Help-anropet bare til kategorien Cmdlet, og deretter pipet det til "select" (alias for Select-Object) for å bare få navnet "egenskapen".

Arbeide med filer og kataloger

Du kan gjøre stort sett alt du er vant til: å navigere til ulike kataloger, noteringsfiler og underkataloger, undersøke innholdet i filer, lage kataloger og filer, osv..

PS C: \ Brukere \ the_g> mkdir test_dir | velg navn Navn ---- test_dir PS C: \ Brukere \ the_g> cd. \ test_dir PS C: \ Brukere \ the_g \ test_dir> "123"> test.txt PS C: \ Brukere \ the_g \ test_dir> ls | navn Navn ---- test.txt PS C: \ Brukere \ the_g \ test_dir> get-content. \ test.txt 123

Arbeider med andre leverandører

Med PowerShell kan du behandle mange ting som filsystemer og navigere dem med cd og kontroller innholdet ved hjelp av ls / dir. Her er noen andre leverandører:

Leverandør Diskdatabutikk -------- ----- ---------- Alias ​​Alias: Windows PowerShell alias Sertifikatcert: x509 sertifikater for digitale signaturer Miljø Env: Windows miljøvariabler Funksjon Funksjon: Windows PowerShell funksjoner Register HKLM :, HKCU: Windows-register Variabel variabel: Windows PowerShell-variabler WSMan WSMan: WS-Management-konfigurasjonsinformasjon 

La oss sjekke ut miljøet og se hvilke Go-relaterte miljøvariabler som er der ute (på min maskin):

PS C: \ Brukere \ the_g> ls env: GO * Navn Verdi ---- ----- GOROOT C: \ GO \ GOPATH C: \ Brukere \ the_g \ Documents \ Go 

formatering

PowerShell oppfordrer til å komponere cmdlets med standardbrytere og lage rørledninger. Formatering er et eksplisitt konsept hvor du i slutten av en rørledning setter en formatter. PowerShell undersøker som standard typen objekt eller objekter i enden av røret og bruker en standardformater. Men du kan overstyre det ved å spesifisere en formatter selv. Formatterer er bare cmdlets. Her er den forrige utgangen som vises i listformat:

PS C: \ Brukere \ the_g> ls env: GO * | Format-List Name: GOROOT Verdi: C: \ Go \ Name: GOPATH Verdi: c: \ Brukere \ the_g \ Documents \ Go 

Profilen

Kraftbrukere som bruker kommandolinjen, har ofte mange oppgaver, rørledninger og favorittkombinasjoner av kommandoer med standardbrytere som de favoriserer. PowerShell-profilen er en PowerShell-skriptfil som lastes og utføres når du starter en ny økt. Du kan sette alle dine favorittverdier der, lage aliaser og funksjoner, angi miljøvariabler, og stort sett alt annet.

Jeg liker å lage navigasjonsalliaser til dypt nestede kataloger, aktivere virtuelle Python-miljøer, og lag snarveier til eksterne kommandoer som jeg kjører ofte, som git og docker.

For meg er profilen uunnværlig fordi PowerShells svært lesbare og konsekvente kommandoer og svitsjer ofte er for omfattende, og de innebygde aliasene er ofte mer problemer enn hjelp (jeg diskuterer dette senere). Her er en veldig delvis utdrag fra profilen min:

# --------------------------- # # DOCKER # # ----------------- ---------- Set-Alias ​​-Name d -Value dockerfunksjon di d bilder # ------------------------ --- # # GIT # # --------------------------- Set-alias -Name g -Value git-funksjonen gs g status funksjon gpu g pull --rebase # ------------------------- # # CONDA # # ---------- --------------- funksjon en activate.ps1 $ args [0] # ---------------------- - # # NAVIGASJON # # ------------------------ funksjon cdg cd $ github_dir # MVP funksjon cdm a ov; cdg; cd MVP # backend-funksjon cdb a ov; cdg; CD backend # scratch-funksjon CDer a ov; cdg; cd scratch # backend pakker funksjon cdbp cdb; cd-pakker # Gå arbeidsområdefunksjon cdgo cd $ go_src_dir

The Prompt 

PowerShell lar deg tilpasse kommandoprompten din. Du må definere en funksjon som kalles prompt (). Du kan se den innebygde hurtigfunksjonen:

PS C: \ Brukere \ the_g> gc funksjon: 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: \ Brukere \ the_g> 

Her er en tilpasset hurtigfunksjon som viser gjeldende tid i tillegg til gjeldende katalog:

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

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

Du kan selvfølgelig gå vill og legge til farger og kontrollere forskjellige forhold som om du er i et bestemt git-repository eller hvis du er admin.

Aliases: The Dark Side

PowerShell fikk aliaser feil, etter min mening, på to separate fronter. Først alias kommandoen tillater bare omdøping av kommandoer. Du kan ikke legge til vanlige flagg eller alternativer for å gjøre kommandoer mer nyttige ved å aliasing dem til seg selv.

Hvis du for eksempel vil søke i tekstlinje for linje, kan du bruke Velg-streng cmdlet:

# Lag en liten tekstfil med 3 linjer "@ ab cd ef @"> 1.txt # Søk etter en linje som inneholder d Get-Content 1.txt | Velg-streng d cd

Det fungerer, men mange vil gjerne gi nytt navn Velg-streng til grep. Men grep er som standard saksfølsom, mens Velg-streng er ikke. No big deal-vi vil bare legge til -CaseSensitive flagg, som i:

Set-Alias-Name grep -Value "Select-String -CaseSensitive" 

Dessverre fungerer det ikke:

16:19:26 C: \ Users \ the_g> Get-Content 1.txt | grep D grep: Begrepet 'Select-String -CaseSensitive' blir ikke gjenkjent som navnet på en cmdlet, funksjon, skriptfil eller operativt program. Kontroller stavemåten til navnet, eller hvis en sti var inkludert, bekreft at stien er riktig og prøv igjen. På linje: 1 kar: 21 + Get-Content 1.txt | grep D + ~~~~ + KategoriInfo: ObjectNotFound: (Select-String -CaseSensitive: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException 

Verdien av et alias være enten en cmdlet, en funksjon, et skript eller et program. Ingen flagg eller argumenter er tillatt. 

Nå kan du gjøre det veldig enkelt i PowerShell, men du må bruke funksjoner og ikke aliaser. Det begrenser ganske mye aliaser til enkel omdøping, som også kan gjøres av funksjoner.

PowerShell vs Bash

På den interaktive skallsiden er PowerShell og Bash ganske like. Bash er mer konsistent som standard, men PowerShells objektrørledning gjør kompliserte rørledninger mer håndterbare. ,

Når det er sagt, kan du nok oppnå noe med en, og hvis du er en strømbruker, har du egne aliaser, funksjoner og snarveier for vanlige oppgaver. På skriptiden går PowerShell langt utover Bash, og for systemadministrasjonsformål slår det til og med Python, Ruby og venner. 

Et viktig aspekt er tilgjengeligheten. Bash kommer forhåndsinstallert med de fleste * nix-distribusjoner (med mindre spesielt strippet), inkludert macOS. Den kan også installeres på Windows via cygwin, git-bash eller msys. PowerShell kommer forhåndsinstallert på Windows og ble nylig tilgjengelig på Mac og Linux.

Konklusjon

Hvis du bruker Windows som en utviklingsmaskin, eller hvis du styrer Windows-maskiner, er PowerShell et uunnværlig verktøy. Det er virkelig et godt gjennomtenkt supersett av Unix-skallene, og det kommer forhåndsinstallert. 

PowerShell er flott programvareutvikling på jobb. Det utviklet seg over et tiår, og det ble innovativt samtidig som den opprettholde sin opprinnelige konseptuelle integritet. Nylig bytte til åpen kildekode og kryssplattform signalerer at det fortsatt er mye mer å vente på.