Hé - ik hoop dat het goed met je gaat.
Ik wil een paar minuten nemen om je op weg te helpen met PowerShell, op een manier die volgens mij minder overweldigend is dan hoe ik het meeste PowerShell-materiaal vroeger vond. Omdat je me hebt verteld dat je steeds over PowerShell hoort en dat je niet weet hoe je erin moet komen.
Het eerste dat u moet weten, is dat het aanvoelt als een opdrachtprompt op steroïden, maar veel nuttiger dan een opdrachtprompt. Je zult zien wat ik bedoel zodra je het opent. Laten we dat doen, maar laten we het openen met 'Als administrator uitvoeren', want dat helpt alleen bij sommige demo's. In het echte leven opent u het alleen met beheerdersrechten als dat echt nodig is.
Dus klik op de startknop en begin PowerShell te typen. Ik wil niet dat je de ISE (nog) opent, zoek gewoon de snelkoppeling "Windows PowerShell" en klik er met de rechtermuisknop op om 'Uitvoeren als beheerder' te kiezen.
Nu het actief is, kunt u het op uw taakbalk vastzetten, zodat u het de volgende keer sneller kunt openen. Als u PowerShell wilt omarmen, moet u het gemakkelijk te openen maken.
Hoe dan ook, dat venster... het voelt meteen alsof je een idee moet hebben wat je moet schrijven. Ja dat klopt. In de ISE was het misschien een beetje makkelijker, en Aaron Nelson (@sqlvariant) heeft me afgeraden om de ISE niet elke keer te gebruiken als ik iets in PowerShell doe, maar hier komt het wel goed.
Laten we beginnen met het doen van enkele basisdingen die we kennen van DOS. De commando's cd
en dir
. Probeer dit:
cd .. dir
Je zult zien dat je omhoog gaat naar C:\WINDOWS
en geef vervolgens de inhoud weer. Geen verrassingen hier, het is net als de opdrachtprompt. Of DOS als je oud genoeg bent.
Het verschil met PowerShell is dat dit niet alleen tekstuitvoer is. Deze dingen zijn objecten . En daar kunnen we wat mee. PowerShell is een ‘getypte’ omgeving. Je bent al de hele tijd met objecten bezig, zoals in Object Explorer in SSMS. PowerShell-objecten kunnen al deze dingen bevatten, evenals .Net-objecten. Dit is waar PowerShell zijn kracht vandaan haalt.
Een paar snelle dingen...
- PowerShell-commando's zijn werkwoordparen, zoals
Set-Location
ofGet-Content
ofGet-ChildItem
. Deze staan bekend als cmdlets, dus als je het woord 'cmdlet' ziet, betekent dit gewoon een PowerShell-opdracht. - PowerShell-opdrachtparameters gebruiken een koppelteken. Zoals:
Get-ChildItem -Recurse
maar je kunt ze ook afkorten, zolang er geen dubbelzinnigheid is. Dus ik zou-rec
. kunnen gebruiken in plaats van-recurse
. - Variabelen beginnen met een dollarteken (
$
). We komen hier later op terug. - We gebruiken geen
>
in filters en tests gebruiken we-gt
.-eq
voor=
,-ne
voor!=
/<>
,-le
voor<=
, enzovoort. Dit is frustrerend, maar je zult eraan wennen. - Er zijn een heleboel afkortingen en aliassen. Eén alias voor
Set-Location
iscd
.Get-ChildItem
is ook bekend alsdir
, enls
te.Where-Object
is?
enForEach-Object
is%
. We zullen deze ook zien als we verder gaan. - Je krijgt bijna alles tab-completion, dus als je
Get-Chi
hebt getypt , kunt u op Tab drukken en door de opties bladeren totdat u vindt wat u zoekt. - Je kunt help gebruiken (wat een alias is voor
Get-Help
) door simpelweg te gebruiken:help dir
, en onderaan die hulp krijg je een leuke herinnering dat jehelp dir -examples
had kunnen gebruiken , en dat het toevoegen van-online
zou een webpagina hebben geopend met de relevante helppagina erop (dat is echt handig). - Je kunt de resultaten van het ene in het andere doorgeven met behulp van het pijpsymbool (
|
). Misschien wel de meest bruikbare isgm
(een alias voorGet-Member
), waarin de eigenschappen en methoden (de leden) worden vermeld voor elk object dat u hebt doorgegeven. #
zal commentaar geven op de regel, of ga tussen<#
en#>
Laten we een deel hiervan in actie zien.
Hier zien we een aantal interessante dingen. Goed om te zien dat we -Exclude
kunnen gebruiken en -Include
. Dat doen we binnenkort. We zouden meer informatie kunnen krijgen met behulp van -detailed
, of -examples
, of -full
.
Laten we onze SQL-map verkennen. Begin met het typen van cd \p
en druk vervolgens op
Druk nu op M en begin opnieuw met Tab om 'Microsoft SQL Server' te vinden. Als u te ver gaat, drukt u op Shift-Tab om achteruit te gaan. (Oh, en als je had moeten kijken op D:
, en begin dan opnieuw met cd D:\p
– maar de principes zijn hetzelfde.)
Super goed. Laten we op Enter drukken en zien dat we van directory zijn veranderd.
Maar laten we nu typen:dir -rec -inc ConfigurationFile.ini
Je had na elke parameter op Tab kunnen klikken en ze zien uitbreiden naar de meer correcte versies. Je had Get-ChildItem
kunnen gebruiken iets strenger zijn. Het maakt me echter niet echt uit. Wanneer u dit uitvoert, ziet u enkele bestanden in de lijst. Ik weet niet hoeveel je er krijgt. Elk geeft aan dat u een installatie van SQL Server hebt uitgevoerd. Maar als SQL-expert weet je dit. U wist misschien niet hoe gemakkelijk PowerShell ze voor u kon opsommen.
OK. Hopelijk zien we hier enig nut voor.
Laten we nu iets doen met deze uitvoer. Ik wil zeggen 'met deze bestanden', maar laten we het data-ding doen en dit zien als een dataset van bestanden.
Stel dat we ze willen tellen. Ik zou de resultaten kunnen doorlopen met ForEach-Object
(maar ik gebruik de sneltoets %
), en verhoog een variabele die ik heb ingesteld. Dit is een veelvoorkomend patroon voor looping - mensen plaatsen hele programma's tussen die accolades, over heel veel regels.
Dit doet de truc, maar ik weet zeker dat er iets ingebouwd is om me dingen te laten tellen.
Nou, ik kan me nooit herinneren wat dat commando is, dus laten we het een van die mooie internetzoekmachines vragen.
Ik wil deze pagina's niet eens openen. Ik wil alleen opmerken dat er een commando is genaamd Measure-Object
. Laten we onze output daarin verwerken. Druk op de toets 'pijl omhoog' om terug te gaan naar een vorige opdracht.
Dit duurt even en vertelt ons dan gelukkig dat het er drie zijn.
Het duurt even omdat het opnieuw door de bestanden moet zoeken. Zullen we die resultaten ergens opslaan?
Ik noem deze dingen haakjes, maar Amerikanen noemen ze haakjes. En wat jij haakjes noemt, noem ik vierkante haakjes. Er zijn ook accolades, die je accolades noemt, denk ik. Ik zal proberen om haakjes 'ronde haakjes' te noemen om verwarring te voorkomen, maar als ik naar een 'haakje' verwijs, bedoel ik een haakje.
Ik ga mijn dir
inpakken commando tussen ronde haakjes en wijs dat toe aan een variabele.
Nu kan ik $configfilelist
pipe pipen in Measure-Object
en het zal sneller reageren, omdat ik mijn resultaten heb opgeslagen.
Maar omdat $configfilelist
is een array van bestanden, kan ik ook naar de lengte kijken om te zien dat er drie items zijn. Dat is veel gemakkelijker. En ik heb toegang tot elke afzonderlijke door vierkante haken van 0 tot 2 te gebruiken.
Dit zijn nog niet echt baanbrekende dingen. Maar die bestanden vertellen ons wel wat nuttige dingen. Laten we een Get-Member
doen commando op onze array.
Laat je hierdoor niet afschrikken. Bovenaan kunnen we zien dat we te maken hebben met objecten van het type System.IO.FileInfo
. Dit is een .Net-ding en daar komt de kracht vandaan. We kunnen zien dat we de Delete
. kunnen aanroepen methoden van deze bestanden, of CopyTo
, of Decrypt
(als ze gecodeerd waren, maar dat zijn ze niet), en meer. Onderaan zien we Eigenschappen.
Dit is interessanter. Laten we eens kijken naar LastWriteTime
. Omdat we misschien geïnteresseerd zijn in wanneer dat is.
We kunnen Select-Object
. gebruiken om alleen bepaalde eigenschappen weer te geven.
Zoals verwacht is er niets naar die bestanden geschreven sinds de installaties daadwerkelijk zijn uitgevoerd. Maar wat als ik dit zou willen filteren, alleen naar degenen sinds een bepaald tijdstip?
Ik ga Get-Date
gebruiken om de huidige datum en tijd te krijgen. Ik ga dat tussen ronde haakjes zetten en de AddYears
. ervan gebruiken methode om een jaar geleden te vinden. In de echte wereld zou ik meer geneigd zijn om AddDays
te gebruiken , maar ik wil wel wat resultaten krijgen.
En ik ga $configfilelist
filteren door naar Where-Object
. te gaan (behalve dat ik een handige snelkoppeling ga gebruiken die het vraagteken is). Mijn filter staat tussen accolades ('accolades', toch?), en binnen die accolades verwijs ik naar de dingen in $configfilelist
met behulp van $_
.
Dus mijn filter gaat als volgt en zegt dat ik degenen wil vermelden die een LastWriteTime
hebben groter dan (-gt
) een jaar eerder:
En ik krijg maar één bestand. Geweldig.
Dat is allemaal goed en wel, maar nu wil ik weten waar die installatie over ging. Daarvoor moeten we in het bestand kijken. Get-Content
is onze vriend hier. Laten we beginnen met het gebruik van Get-Content
rechtstreeks tegen een bestand. Het zal gemakkelijk zijn om het later in ons juiste commando te haken.
Get-Content
retourneert in feite een reeks regels, en heeft echt nuttige parameters zoals -TotalCount
die stopt na een bepaald aantal regels, of -Tail
die regels krijgt aan het einde van het bestand. Ik vind dit geweldig als ik te maken heb met grote bestanden - het is niet alsof ik ze in Kladblok kan openen.
Laat me je vertellen over Select-String te. Het is net als grep
van Unix - je gebruikt het om de gewenste regels in een bestand te krijgen.
Die uitvoer lijkt lastig, maar onthoud dat dit slechts de tekenreeksrepresentatie van een object is. Als ik mijn opdracht naar gm
stuur (Get-Member
), je zult zien wat ik bedoel.
Dus nu kan ik zien dat ik toegang heb tot het Path
van het bestand, de Line
, het LineNumber
, enz., afzonderlijk.
Om naar meerdere dingen te zoeken, wil ik een reeks parameters doorgeven aan -Pattern
. Ik doe dat door simpelweg een komma te gebruiken om te ontdekken dat het een installatie van Analysis Services was.
Hopelijk begin je de kracht hiervan in te zien.
Ik kan het allemaal in één regel plaatsen met:
dir -rec -inc ConfigurationFile.ini | ? {$_.LastWriteTime -gt (Get-Date).AddYears(-1)} | select-string -Pattern 'FEATURES=','ACTION=' | select-object Path, Line
(Sorry, je zult waarschijnlijk zijwaarts moeten scrollen om dat allemaal te zien - alles op één regel krijgen is niet bepaald een deugd in HTML.)
Als je dingen uitwerkt die je leuk vindt, wil je de opdrachten ergens opslaan voor later (zoals in een .ps1-bestand dat je uitvoert). Daarvoor wil je op de hoogte zijn van Get-History
. Het geeft een overzicht van alles wat je in die sessie hebt uitgevoerd.
En een leuke kleine truc is dat je negatieve getallen kunt gebruiken om vanaf de andere kant in arrays te haken. Dus je kunt dit doen:
Maar in plaats van het alleen weer te geven, pijp het in clip
:
... die het op het klembord krijgt.
Ik ga hier niet veel verder op in, maar je zou dit zelf steeds verder kunnen pushen en onderzoeken wat voor soort dingen interessant kunnen zijn in je werk. U kunt resultaten in bestanden dumpen met >
en toe te voegen aan bestanden met behulp van >>
.
Overweeg nu commando's als:
Get-EventLog -LogName Application -After (Get-Date).AddHours(-1) -EntryType Error
…en stel je voor wat je daarmee zou kunnen doen.
Probeer het eens:Import-Module SQLServer
Wat je vervolgens laat gaan:
cd SQLSERVER:
En blader door de SQL-omgeving alsof het een bestandssysteem is.
Ik gebruik PowerShell niet vaak om SQL op deze manier te verkennen, moet ik toegeven. Maar het feit dat ik het kan, geeft me zeker een heleboel opties. Het feit dat ik PowerShell zou kunnen gebruiken om een Word-document te maken zoals ze doen op https://learn-powershell.net/2014/12/31/beginning-with-powershell-and-word/, of e-mails verzenden zoals beschreven op https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage, of bel webservices (inclusief Azure Machine Learning-services) zoals beschreven op https://docs.microsoft .com/en-gb/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest betekent dat je met een beetje fantasie PowerShell kunt gebruiken om zo ongeveer alles te doen wat je wilt. Ik gebruik Invoke-SqlCommand graag om gegevens uit SQL te halen en deze in Invoke-WebRequest
te duwen om scores van Azure ML op te halen en dienovereenkomstig te reageren. PowerShell maakt het heel eenvoudig.
Oh, en om PowerShell-commando's op andere machines uit te voeren (wat natuurlijk heel handig kan zijn), liet een snelle 'zoekopdracht op internet' me deze handig ogende pagina zien:https://www.howtogeek.com/117192/how-to -run-powershell-commands-on-remote-computers/
Je zou een lijst met computers in een bestand kunnen hebben en er als volgt doorheen lopen:
Probeer wat dingen. Sla jezelf eruit. En ontdek wat iedereen schrijft voor T-SQL dinsdag deze maand, gehost door Rob Sewell (@sqldbawithbeard)
@rob_farley