Hej - håber du har det godt.
Jeg vil gerne bruge et par minutter på at komme i gang med PowerShell, på en måde, som jeg synes er mindre overvældende, end jeg fandt det meste af PowerShell-materiale dengang. Fordi du har fortalt mig, at du bliver ved med at høre om PowerShell, og at du ikke kan fortælle, hvordan du kommer ind i det.
Den første ting at vide er, at det føles som kommandoprompt på steroider, men meget mere nyttigt end kommandoprompt. Du vil se, hvad jeg mener, så snart du åbner den. Lad os gøre det, men lad os åbne det ved at bruge 'Kør som administrator', for det hjælper bare for nogle af demoerne. I det virkelige liv vil du kun åbne det med administratorrettigheder, hvis du virkelig har brug for det.
Så klik på startknappen og begynd at skrive PowerShell. Jeg vil ikke have, at du åbner ISE (endnu), bare find "Windows PowerShell"-genvejen og højreklik på den for at vælge 'Kør som administrator'.
Nu hvor det kører, skal du fastgøre det til din proceslinje, så du kan få adgang til det hurtigere næste gang. Hvis du vil prøve at omfavne PowerShell, bør du gøre det nemt at åbne.
I hvert fald, det vindue... med det samme føles det som om, du skal have en anelse om, hvad du skal skrive. Ja det er rigtigt. Tingene kunne have været lidt nemmere i ISE, og Aaron Nelson (@sqlvariant) har sagt til mig for ikke at bruge ISE, hver gang jeg laver noget i PowerShell, men vi skal nok klare det her.
Lad os starte med at gøre nogle grundlæggende ting, som vi kender fra DOS. Kommandoerne cd
og dir
. Prøv dette:
cd .. dir
Du vil se, at du flytter op til C:\WINDOWS
, og angiv derefter indholdet. Ingen overraskelser her, det er ligesom kommandoprompt. Eller DOS, hvis du er gammel nok.
Forskellen med PowerShell er, at dette ikke kun er tekstoutput. Disse ting er objekter . Og det kan vi gøre noget med. PowerShell er et 'indskrevet' miljø. Du beskæftiger dig allerede med objekter hele tiden, som i Object Explorer i SSMS. PowerShell-objekter kan inkludere alle disse ting, såvel som .Net-objekter. Det er her PowerShell får sin kraft fra.
Et par hurtige ting...
- PowerShell-kommandoer kommer i verbum-navneord-par, såsom
Set-Location
ellerGet-Content
ellerGet-ChildItem
. Disse er kendt som cmdlets, så når du ser ordet 'cmdlet', betyder det bare en PowerShell-kommando. - PowerShell-kommandoparametre bruger en bindestreg. Ligesom:
Get-ChildItem -Recurse
men du kan også forkorte dem, så længe der ikke er nogen tvetydighed. Så jeg kunne bruge-rec
i stedet for-recurse
. - Variabler starter med et dollartegn (
$
). Vi kommer til dette senere. - Vi bruger ikke
>
i filtre og tests bruger vi-gt
.-eq
for=
,-ne
for!=
/<> ,
-le
for<=
, og så videre. Det er frustrerende, men du vil vænne dig til det.- Der er en masse forkortelser og aliasser. Ét alias for
Set-Location
ercd
.Get-ChildItem
er også kendt somdir
ogls
også.Hvor-objekt
er?
ogForEach-Object
er%
. Vi vil også se disse, mens vi går videre.- Du får tabulatorfuldførelse på næsten alt, så hvis du har skrevet
Get-Chi
, kan du trykke på Tab og cykle gennem mulighederne, indtil du finder det, du vil have.- Du kan bruge hjælp (som er et alias for
Få-hjælp
). ) ved blot at bruge:help dir
, og nederst i denne hjælp får du en god påmindelse om, at du kunne have brugthelp dir -examples
, og at tilføje-online
ville have åbnet en webside med den relevante hjælpeside på (det er virkelig praktisk).- Du kan overføre resultaterne af én ting til en anden ved at bruge rørsymbolet (
|
). Den måske mest nyttige ergm
(et alias forGet-Member
), som viser egenskaberne og metoderne (medlemmerne) for det objekt, du har sendt ind.#
vil kommentere linjen eller gå mellem<#
og#>
- Der er en masse forkortelser og aliasser. Ét alias for
Lad os se noget af dette i aktion.
Her kan vi se nogle interessante ting. Godt at bemærke, at vi kunne bruge -Exclude
og -Inkluder
. Det gør vi snart. Vi kunne få flere oplysninger ved at bruge -detailed
eller -eksempler
, eller -fuld
.
Lad os udforske vores SQL-mappe. Start med at skrive cd \p
og tryk derefter på
Tryk nu på M og begynd at trykke på Tab igen for at finde 'Microsoft SQL Server'. Hvis du går for langt, skal du trykke på Shift-Tab for at gå tilbage. (Åh, og hvis du skulle have kigget på D:
, og start derefter igen med cd D:\p
– men principperne er de samme.)
Store. Lad os trykke på Enter og se, at vi har ændret mappe.
Men lad os nu skrive:dir -rec -inc ConfigurationFile.ini
Du kunne have ramt Tab efter hver parameter og set dem udvide sig til de mere korrekte versioner. Du kunne have brugt Get-ChildItem
at være lidt strengere. Jeg er dog ligeglad. Når du kører dette, vil du se nogle filer på listen. Jeg ved ikke hvor mange du får. Hver enkelt angiver, at du har kørt en installation af SQL Server. Men som SQL-ekspert ved du dette. Du har måske bare ikke vidst, hvor nemt PowerShell kunne liste dem for dig.
Okay. Forhåbentlig kan vi se noget brug for dette.
Lad os nu gøre noget med dette output. Jeg vil gerne sige 'med disse filer', men lad os gøre det med data og tænke på dette som et datasæt af filer.
Antag, at vi vil tælle dem. Jeg kunne gå gennem resultaterne ved hjælp af ForEach-Object
(men jeg bruger genvejen %
), og forøg en variabel, som jeg har sat op. Dette er et almindeligt mønster for looping – folk sætter hele programmer inden for de krøllede parenteser på tværs af mange linjer.
Dette gør tricket, men jeg er sikker på, at der er noget indbygget, så jeg kan tælle ting.
Nå, jeg kan aldrig huske, hvad den kommando, så lad os spørge en af de smarte internetsøgningsudbydere.
Jeg ønsker ikke engang at åbne disse sider. Jeg vil bare bemærke, at der er en kommando kaldet Measure-Object
. Lad os røre vores output ind i det. Tryk på 'pil op'-tasten for at gå tilbage til en tidligere kommando.
Dette tager et øjeblik, og fortæller os så glad, at der er tre.
Det tager et øjeblik, fordi det er nødt til at søge gennem filerne igen. Hvad med at vi gemmer disse resultater et sted?
Nu kalder jeg disse ting for parenteser, men amerikanerne kalder dem parenteser. Og det du kalder parentes, kalder jeg firkantede parenteser. Der er også krøllede beslag, som man kalder seler tror jeg. Jeg vil forsøge at kalde parenteser 'runde parenteser' for at undgå forvirring, men hvis jeg henviser til en 'parentes', mener jeg en parentes.
Jeg vil pakke min dir
kommando i runde parenteser, og tildel det til en variabel.
Nu kan jeg pipe $configfilelist
ind i Measure-Object
og det vil være mere responsivt, fordi jeg har gemt mine resultater.
Men fordi $configfilelist
er en række filer, kan jeg også se på dens længde for at se, at der er tre elementer. Det er meget nemmere. Og jeg kan få adgang til hver enkelt ved at bruge firkantede parenteser fra 0 til 2.
Dette er ikke ligefrem banebrydende ting endnu. Men disse filer fortæller os nogle nyttige ting. Lad os lave en Get-Member
kommando på vores array.
Lad dig ikke afskrække af dette. Øverst kan vi se, at vi har at gøre med objekter, der er af typen System.IO.FileInfo
. Dette er en .Net-ting, og det er her strømmen kommer fra. Vi kan se, at vi kunne kalde CopyTo
, eller Dekrypter
(hvis de var krypteret, men det er de ikke), og mere. Nederst ser vi Egenskaber.
Dette er mere interessant. Lad os se på LastWriteTime
. For vi kan være interesserede i, hvornår det er.
Vi kan bruge Select-Object
kun at vise bestemte egenskaber.
Som forventet er der ikke skrevet noget til disse filer, da installationerne faktisk blev udført. Men hvad nu hvis jeg ville filtrere dette, kun til dem siden et bestemt tidspunkt?
Jeg vil bruge Get-Date
for at få den aktuelle dato og klokkeslæt. Jeg vil pakke det ind i runde parenteser og bruge dets AddYears
metode at finde for et år siden. I den virkelige verden ville jeg være mere tilbøjelig til at bruge AddDays
, men jeg vil gerne have nogle resultater.
Og jeg vil filtrere $configfilelist
ved at gå ind i Where-Object
(bortset fra at jeg vil bruge en praktisk genvej, som er spørgsmålstegnet). Mit filter findes inden for krøllede parenteser ('bøjler', ikke?), og inden for disse krøllede parenteser henviser jeg til tingene i $configfilelist
ved hjælp af $__
.
Så mit filter går sådan her og siger, at jeg vil liste dem, der har en LastWriteTime
større end (-gt
) et år før nu:
Og jeg får kun én fil. Fantastisk.
Det er alt godt, men nu vil jeg gerne vide, hvad den installation handlede om. Til det skal vi kigge inde i filen. Hent-indhold
er vores ven her. Lad os starte med at bruge Get-Content
mod en fil direkte. Det vil være nemt at tilslutte den til vores rigtige kommando senere.
Hent-indhold
returnerer faktisk en række linjer og har virkelig nyttige parametre som -TotalCount
som stopper efter et vist antal linjer, eller -Tail
som får linjer i slutningen af filen. Jeg elsker dette, når jeg har at gøre med store filer - det er ikke sådan, at jeg kan åbne dem i Notesblok.
Lad mig fortælle dig om Vælg-streng også. Det er ligesom grep
fra Unix – du bruger det til at få de linjer, du ønsker i en fil.
Det output virker som en smerte, men husk, at dette kun er strengrepræsentationen af et objekt. Hvis jeg overfører min kommando til gm
(Get-Member
), vil du se, hvad jeg mener.
Så nu kan jeg se, at jeg kan få adgang til Stien
af filen, Linjen
, LineNumber
osv., separat.
For at lede efter flere ting vil jeg videregive en række parametre til -Pattern
. Det gør jeg ved blot at bruge et komma for at opdage, at det var en installation af Analysis Services.
Forhåbentlig begynder du at se kraften i dette.
Jeg kan slippe det hele på én linje ved at bruge:
dir -rec -inc ConfigurationFile.ini | ? {$_.LastWriteTime -gt (Get-Date).AddYears(-1)} | select-string -Pattern 'FEATURES=','ACTION=' | select-object Path, Line
(Beklager, du bliver sandsynligvis nødt til at rulle sidelæns for at se alt det – at få alt på en enkelt linje er ikke ligefrem en dyd i HTML.)
Når du arbejder på ting, du kan lide, vil du gerne gemme kommandoerne et sted til senere (såsom i en .ps1-fil, du kører). Til det skal du være opmærksom på Get-History
. Den viser alt, hvad du har kørt i den session.
Og et fint lille trick er, at du kan bruge negative tal til at tilslutte arrays fra den anden ende. Så du kan gøre dette:
Men i stedet for bare at vise det, kan du overføre det til clip
:
…hvilket får det ind på udklipsholderen.
Jeg vil ikke gå meget længere med dette, men du kan selv blive ved med at skubbe dette længere og længere ud og udforske de typer ting, der kunne være interessante i dit job. Du kan dumpe resultater i filer ved hjælp af >
og føj til filer ved hjælp af >>
.
Overvej nu kommandoer som:
Get-EventLog -LogName Application -After (Get-Date).AddHours(-1) -EntryType Error
…og forestil dig, hvad du kunne gøre med det.
Prøv at gøre:Import-Module SQLServer
Som så lader dig gå:
cd SQLSERVER:
Og gennemse SQL-miljøet, som om det var et filsystem.
Jeg plejer ikke at bruge PowerShell til at udforske SQL på denne måde meget ofte, må jeg indrømme. Men det, at jeg kan, giver mig helt sikkert en masse muligheder. Det faktum, at jeg kunne bruge PowerShell til at oprette et Word-dokument, som de gør på https://learn-powershell.net/2014/12/31/beginning-with-powershell-and-word/, eller sende e-mails som beskrevet på https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage, eller ring til webtjenester (inklusive Azure Machine Learning) som beskrevet på https://docs.microsoft .com/en-gb/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest betyder, at du med lidt fantasi kan bruge PowerShell til at gøre næsten, hvad du vil. Jeg elsker at bruge Invoke-SqlCommand til at få data ud af SQL, skub det ind i Invoke-WebRequest
for at få resultater fra Azure ML, og derefter svare i overensstemmelse hermed. PowerShell gør det virkelig ligetil.
Åh, og for at køre PowerShell-kommandoer på andre maskiner (hvilket selvfølgelig kan være ret nyttigt), viste en hurtig 'internetsøgning' mig denne nyttigt udseende side:https://www.howtogeek.com/117192/how-to -kør-powershell-kommandoer-på-fjerncomputere/
Du kunne have en liste over computere inde i en fil og gå gennem den sådan her:
Prøv nogle ting. Slå dig selv ud. Og udforsk, hvad alle skriver til T-SQL tirsdag i denne måned, hostet af Rob Sewell (@sqldbawithbeard)
@rob_farley