sql >> Databasteknik >  >> RDS >> Database

Eftersom du behöver känna till PowerShell

Hej - hoppas du mår bra.

Jag vill ta några minuter för att komma igång med PowerShell, på ett sätt som jag tycker är mindre överväldigande än hur jag hittade det mesta PowerShell-materialet förr i tiden. Eftersom du har sagt till mig att du fortsätter att höra om PowerShell och att du inte kan säga hur du kommer in i det.

Det första att veta är att det känns som kommandotolken på steroider, men mycket mer användbart än kommandotolken. Du kommer att se vad jag menar så fort du öppnar den. Låt oss göra det, men låt oss öppna det med "Kör som administratör", eftersom det bara hjälper för några av demos. I verkligheten kommer du bara att öppna den med administratörsrättigheter om du verkligen behöver.

Så klicka på startknappen och börja skriva PowerShell. Jag vill inte att du ska öppna ISE (ännu), hitta bara genvägen "Windows PowerShell" och högerklicka på den för att välja "Kör som administratör".

Nu när det körs, fäst det i aktivitetsfältet så att du kan komma åt det snabbare nästa gång. Om du ska försöka omfamna PowerShell bör du göra det enkelt att öppna.

Hur som helst, det där fönstret... det känns direkt som att du måste ha en aning om vad du ska skriva. Ja det stämmer. Saker och ting kan ha varit lite lättare i ISE, och Aaron Nelson (@sqlvariant) har sagt till mig för att jag inte använder ISE varje gång jag gör något i PowerShell, men vi kommer att klara oss här.

Låt oss börja med att göra några grundläggande saker som vi känner till från DOS. Kommandona cd och dir . Prova detta:

cd ..
dir

Du kommer att se att du flyttar upp till C:\WINDOWS , och lista sedan innehållet. Inga överraskningar här, det är precis som kommandotolken. Eller DOS om du är gammal nog.

Skillnaden med PowerShell är att detta inte bara är textutmatning. Dessa saker är objekt . Och vi kan göra saker med det. PowerShell är en "skriven" miljö. Du hanterar redan objekt hela tiden, som i Objektutforskaren i SSMS. PowerShell-objekt kan inkludera alla dessa saker, såväl som .Net-objekt. Det är här PowerShell får sin kraft ifrån.

Några snabba saker...

  1. PowerShell-kommandon kommer i verb-substantiv-par, till exempel Set-Location eller Get-Content eller Get-ChildItem . Dessa är kända som cmdlets, så när du ser ordet "cmdlet" betyder det bara ett PowerShell-kommando.
  2. PowerShell-kommandoparametrar använder ett bindestreck. Som:Get-ChildItem -Recurse men du kan också förkorta dem så länge det inte finns någon tvetydighet. Så jag kunde använda -rec istället för -recurse .
  3. Variabler börjar med ett dollartecken ($ ). Vi kommer till detta senare.
  4. Vi använder inte > i filter och tester använder vi -gt . -eq för = , -ne för != /<> , -le för <= , och så vidare. Det här är frustrerande, men du vänjer dig vid det.
  5. Det finns ett gäng förkortningar och alias. Ett alias för Set-Location är cd . Get-ChildItem är också känd som dir och ls för. Where-Object är ? och ForEach-Object är % . Vi kommer att se dessa allt eftersom.
  6. Du får tabbkomplettering på nästan allt, så om du har skrivit Get-Chi , kan du trycka på Tab och bläddra igenom alternativen tills du hittar det du vill ha.
  7. Du kan använda hjälp (som är ett alias för Get-Help ) genom att helt enkelt använda:help dir , och längst ner i den hjälpen får du en trevlig påminnelse om att du kunde ha använt help dir -examples , och att lägga till -online skulle ha öppnat en webbsida med den relevanta hjälpsidan på (det är väldigt praktiskt).
  8. Du kan överföra resultaten av en sak till en annan med hjälp av rörsymbolen (| ). Den kanske mest användbara är gm (ett alias för Get-Member ), som kommer att lista egenskaperna och metoderna (medlemmarna) för vilket objekt du än har skickat in.
  9. # kommer att kommentera raden eller gå mellan <# och #>

Låt oss se en del av detta i aktion.

Här kan vi se några intressanta saker. Bra att notera att vi kan använda -Exclude och -Inkludera . Det gör vi snart. Vi kan få mer information med -detailed , eller -exempel , eller -full .

Låt oss utforska vår SQL-mapp. Börja med att skriva cd \p och tryck sedan på Tab tills den visar programfiler.

Tryck nu på M och börja trycka på Tab igen för att hitta "Microsoft SQL Server". Om du går för långt, tryck Skift-Tab för att gå bakåt. (Åh, och om du skulle ha tittat på D: , börja sedan igen med cd D:\p – men principerna är desamma.)

Bra. Låt oss trycka på Enter och se att vi har bytt katalog.

Men låt oss nu skriva:dir -rec -inc ConfigurationFile.ini

Du kunde ha tryckt på Tab efter varje parameter och sett dem expandera till de mer korrekta versionerna. Du kunde ha använt Get-ChildItem att vara lite striktare. Jag bryr mig inte riktigt dock. När du kör detta kommer du att se några filer listade. Jag vet inte hur många du kommer att få. Var och en anger att du körde en installation av SQL Server. Men som SQL-expert vet du detta. Du kanske inte visste hur lätt PowerShell kunde lista dem åt dig.

Ok. Förhoppningsvis ser vi någon användning för detta.

Låt oss nu göra något med denna utgång. Jag vill säga "med de här filerna", men låt oss göra datagrejen och tänka på detta som en datauppsättning av filer.

Anta att vi vill räkna dem. Jag kunde gå igenom resultaten med ForEach-Object (men jag använder genvägen % ), och öka en variabel som jag ställer in. Det här är ett vanligt mönster för looping – folk lägger hela program inom de där krulliga parenteserna, över många linjer.

Det här gör susen, men jag är säker på att det finns något inbyggt som låter mig räkna saker.

Tja, jag kan aldrig komma ihåg vad det kommandot, så låt oss fråga en av de där snygga internetsökleverantörerna.

Jag vill inte ens öppna dessa sidor. Jag vill bara lägga märke till att det finns ett kommando som heter Measure-Object . Låt oss lägga in vår produktion i det. Tryck på "uppåtpilen" för att gå tillbaka till ett tidigare kommando.

Detta tar en stund och berättar sedan glatt att det finns tre.

Det tar en stund eftersom det måste söka igenom filerna igen. Vad sägs om att vi lagrar dessa resultat någonstans?

Nu kallar jag dessa saker för parenteser, men amerikaner kallar dem parenteser. Och det du kallar parentes, kallar jag hakparenteser. Det finns lockiga fästen också, som man kallar hängslen tror jag. Jag ska försöka kalla parenteser för "runda parenteser" för att undvika förvirring, men om jag hänvisar till en "parentes", menar jag en parentes.

Jag kommer att radbryta min dir kommandot inom runda parenteser och tilldela det till en variabel.

Nu kan jag pipe $configfilelist till Measure-Object och det kommer att vara mer lyhört eftersom jag har lagrat mina resultat.

Men eftersom $configfilelist är en mängd filer, jag kan också titta på dess längd för att se att det finns tre objekt. Det är mycket lättare. Och jag kan komma åt varje enskild genom att använda hakparenteser från 0 till 2.

Det här är inte direkt banbrytande grejer än. Men de filerna säger oss några användbara saker. Låt oss göra en Get-Member kommando på vår array.

Låt dig inte avskräckas av detta. Överst kan vi se att vi har att göra med objekt som är av typen System.IO.FileInfo . Detta är en .Net-sak och det är där kraften kommer ifrån. Vi kan se att vi kan kalla Delete metoder för dessa filer, eller CopyTo , eller Dekryptera (om de var krypterade, men det är de inte), och mer. Längst ner ser vi egenskaper.

Det här är mer intressant. Låt oss titta på LastWriteTime . För vi kanske är intresserade av när det är.

Vi kan använda Select-Object att endast visa vissa egenskaper.

Som väntat har ingenting skrivits till dessa filer eftersom installationerna faktiskt gjordes. Men vad händer om jag ville filtrera detta, bara till ettor sedan en viss tidpunkt?

Jag kommer att använda Get-Date för att få aktuellt datum och tid. Jag ska slå in det inom runda parenteser och använda dess AddYears metod att hitta för ett år sedan. I den verkliga världen skulle jag vara mer benägen att använda AddDays , men jag vill få några resultat.

Och jag kommer att filtrera $configfilelist genom att gå in i Where-Object (förutom att jag kommer att använda en bekväm genväg som är frågetecknet). Mitt filter finns inom krulliga parenteser (‘klosettparenteser’, eller hur?), och inom dessa krulliga parenteser hänvisar jag till sakerna i $configfilelist med $__ .

Så mitt filter går så här och säger att jag vill lista de som har en LastWriteTime större än (-gt ) ett år innan nu:

Och jag får bara en fil. Fantastiskt.

Det är väl och bra, men nu vill jag veta vad den installationen handlade om. För det måste vi titta inuti filen. Hämta innehåll är vår vän här. Låt oss börja med att använda Get-Content mot en fil direkt. Det blir lätt att koppla in den i vårt rätta kommando senare.

Hämta innehåll returnerar faktiskt en rad rader och har riktigt användbara parametrar som -TotalCount som stannar efter ett visst antal rader, eller -Tail som får rader i slutet av filen. Jag älskar det här när jag har att göra med stora filer – det är inte så att jag kan öppna dem i Anteckningar.

Låt mig berätta om Välj-sträng för. Det är som grep från Unix – du använder den för att få de rader du vill ha i en fil.

Den utgången verkar vara jobbig, men kom ihåg att detta bara är strängrepresentationen av ett objekt. Om jag piper mitt kommando till gm (Get-Member ), du förstår vad jag menar.

Så nu kan jag säga att jag kan komma åt Sökvägen i filen, Linjen , LineNumber etc. separat.

För att leta efter flera saker vill jag skicka en rad parametrar till -Pattern . Jag gör det genom att helt enkelt använda ett kommatecken för att upptäcka att det var en installation av Analysis Services.

Förhoppningsvis börjar du se kraften i detta.

Jag kan lägga allt på en rad genom att använda:

dir -rec -inc ConfigurationFile.ini | ? {$_.LastWriteTime -gt (Get-Date).AddYears(-1)} | select-string -Pattern 'FEATURES=','ACTION=' | select-object Path, Line

(Tyvärr, du kommer förmodligen att behöva rulla i sidled för att se allt det där – att få allt på en enda rad är inte precis en dygd i HTML.)

När du arbetar med saker som du gillar vill du lagra kommandona någonstans för senare (som i en .ps1-fil som du kör). För det vill du vara medveten om Get-History . Den listar allt du har kört under den sessionen.

Och ett snyggt litet knep är att du kan använda negativa tal för att koppla in arrayer från den andra änden. Så du kan göra så här:

Men istället för att bara visa det, flytta det till klipp :

...som får det till urklippet.

Jag tänker inte gå mycket längre med det här, men du kan fortsätta driva det här längre och längre själv och utforska vilka typer av saker som kan vara intressanta i ditt jobb. Du kan dumpa resultat till filer med > och lägg till filer med >> .

Tänk nu på kommandon som:

Get-EventLog -LogName Application -After (Get-Date).AddHours(-1) -EntryType Error

… och tänk vad du kan göra med det.

Försök att göra:Import-Module SQLServer

Som sedan låter dig gå:

cd SQLSERVER:

Och bläddra i SQL-miljön som om det vore ett filsystem.

Jag brukar inte använda PowerShell för att utforska SQL så här så ofta, måste jag erkänna. Men det faktum att jag kan ger mig verkligen en massa alternativ. Det faktum att jag kunde använda PowerShell för att skapa ett Word-dokument som de gör på https://learn-powershell.net/2014/12/31/beginning-with-powershell-and-word/, eller skicka e-postmeddelanden enligt beskrivningen på https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage, eller ring webbtjänster (inklusive Azure Machine Learning) enligt beskrivningen på https://docs.microsoft .com/en-gb/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest innebär att du med lite fantasi kan använda PowerShell för att göra precis vad du vill. Jag älskar att använda Invoke-SqlCommand för att få ut data från SQL, skjut in det i Invoke-WebRequest för att få poäng från Azure ML och sedan svara därefter. PowerShell gör det riktigt enkelt.

Åh, och för att köra PowerShell-kommandon på andra maskiner (vilket kan vara ganska användbart, naturligtvis), visade en snabb "internetsökning" mig denna användbara sida:https://www.howtogeek.com/117192/how-to -kör-powershell-kommandon-på-fjärrdatorer/

Du kan ha en lista över datorer i en fil och gå igenom den så här:

Prova några grejer. Varsågod. Och utforska vad alla skriver för T-SQL tisdag denna månad, värd av Rob Sewell (@sqldbawithbeard)

@rob_farley


  1. Lägg till sökningssortering och sök med jquery datatable

  2. Hur man uppgraderar från MariaDB 10.4 till MariaDB 10.5

  3. Den parameteriserade frågan ..... förväntar sig parametern '@units', som inte angavs

  4. Introduktion till PL/SQL VARRAYs i Oracle Database