Database
 sql >> Datenbank >  >> RDS >> Database

Weil Sie PowerShell kennen müssen

Hey – hoffe dir geht es gut.

Ich möchte mir ein paar Minuten Zeit nehmen, um Ihnen den Einstieg in PowerShell zu erleichtern, und zwar auf eine Weise, die meiner Meinung nach weniger überwältigend ist als die Art und Weise, wie ich damals das meiste PowerShell-Material gefunden habe. Weil Sie mir gesagt haben, dass Sie immer wieder von PowerShell hören und dass Sie nicht sagen können, wie Sie darauf zugreifen sollen.

Das erste, was Sie wissen müssen, ist, dass es sich wie eine Eingabeaufforderung auf Steroiden anfühlt, aber viel nützlicher als eine Eingabeaufforderung ist. Sie werden sehen, was ich meine, sobald Sie es öffnen. Lassen Sie uns das tun, aber öffnen wir es mit "Als Administrator ausführen", denn das hilft nur für einige der Demos. Im wirklichen Leben öffnen Sie es nur mit Administratorrechten, wenn Sie es wirklich müssen.

Klicken Sie also auf die Schaltfläche Start und beginnen Sie mit der Eingabe von PowerShell. Ich möchte nicht, dass Sie die ISE (noch) öffnen, suchen Sie einfach die Verknüpfung „Windows PowerShell“ und klicken Sie mit der rechten Maustaste darauf, um „Als Administrator ausführen“ auszuwählen.

Jetzt, wo es ausgeführt wird, heften Sie es an Ihre Taskleiste, damit Sie beim nächsten Mal schneller darauf zugreifen können. Wenn Sie versuchen, PowerShell zu nutzen, sollten Sie es einfach zu öffnen machen.

Wie auch immer, dieses Fenster … sofort fühlt es sich an, als müsste man eine Ahnung haben, was man schreiben soll. Ja, das ist richtig. In der ISE waren die Dinge vielleicht etwas einfacher, und Aaron Nelson (@sqlvariant) hat mir gesagt, dass ich die ISE nicht jedes Mal verwende, wenn ich etwas in PowerShell mache, aber wir werden hier in Ordnung sein.

Beginnen wir mit einigen grundlegenden Dingen, die wir von DOS kennen. Die Befehle cd und dir . Versuchen Sie Folgendes:

cd ..
dir

Sie werden sehen, dass Sie nach oben zu C:\WINDOWS wechseln , und listen Sie dann den Inhalt auf. Hier gibt es keine Überraschungen, es ist genau wie bei der Eingabeaufforderung. Oder DOS, wenn Sie alt genug sind.

Der Unterschied zu PowerShell besteht darin, dass dies nicht nur eine Textausgabe ist. Diese Dinge sind Objekte . Und damit können wir was anfangen. PowerShell ist eine „typisierte“ Umgebung. Sie beschäftigen sich bereits ständig mit Objekten, wie im Objekt-Explorer in SSMS. PowerShell-Objekte können all diese Dinge enthalten, ebenso wie .Net-Objekte. Hier bezieht PowerShell seine Leistung.

Ein paar schnelle Dinge…

  1. PowerShell-Befehle kommen in Verb-Substantiv-Paaren vor, z. B. Set-Location oder Get-Content oder Get-ChildItem . Diese werden als Cmdlets bezeichnet. Wenn Sie also das Wort „Cmdlet“ sehen, bedeutet dies nur einen PowerShell-Befehl.
  2. PowerShell-Befehlsparameter verwenden einen Bindestrich. Wie:Get-ChildItem -Recurse Sie können sie aber auch abkürzen, solange es keine Mehrdeutigkeit gibt. Also könnte ich -rec verwenden statt -recurse .
  3. Variablen beginnen mit einem Dollarzeichen ($ ). Dazu kommen wir später.
  4. Wir verwenden > nicht In Filtern und Tests verwenden wir -gt . -eq für = , -ne für != /<> , -le für <= , und so weiter. Das ist frustrierend, aber man gewöhnt sich daran.
  5. Es gibt eine Menge Abkürzungen und Aliase. Ein Alias ​​für Set-Location ist cd . Get-ChildItem wird auch als dir bezeichnet , und ls zu. Where-Object ist ? und ForEach-Object ist % . Wir werden diese auch sehen, wenn wir weitermachen.
  6. Du erhältst bei fast allem eine Tab-Vervollständigung, also wenn du Get-Chi getippt hast , können Sie die Tabulatortaste drücken und durch die Optionen blättern, bis Sie das Gewünschte gefunden haben.
  7. Sie können help verwenden (das ist ein Alias ​​für Get-Help ), indem Sie einfach Folgendes verwenden:help dir , und am Ende dieser Hilfe erhalten Sie eine nette Erinnerung, dass Sie help dir -examples hätten verwenden können , und das Hinzufügen von -online hätte eine Webseite mit der entsprechenden Hilfeseite geöffnet (das ist wirklich praktisch).
  8. Mit dem Pipe-Symbol (|) können Sie die Ergebnisse einer Sache in eine andere übergeben ). Das vielleicht nützlichste ist gm (ein Alias ​​für Get-Member ), die die Eigenschaften und Methoden (die Mitglieder) für jedes Objekt auflistet, das Sie übergeben haben.
  9. # kommentiert die Zeile oder wechselt zwischen <# und #>

Sehen wir uns einige davon in Aktion an.

Hier können wir einige interessante Dinge sehen. Gut zu bemerken, dass wir -Exclude verwenden könnten und -Include . Das machen wir bald. Weitere Informationen könnten wir mit -detailed erhalten , oder -examples , oder -full .

Lassen Sie uns unseren SQL-Ordner erkunden. Beginnen Sie mit der Eingabe von cd \p und drücken Sie dann Tab bis es Ihnen Programmdateien anzeigt.

Drücken Sie jetzt M und drücken Sie erneut die Tabulatortaste, um „Microsoft SQL Server“ zu finden. Wenn Sie zu weit gehen, drücken Sie Shift-Tab, um rückwärts zu gehen. (Oh, und wenn Sie auf D: hätten schauen sollen , dann wieder mit cd D:\p beginnen – aber die Prinzipien sind die gleichen.)

Toll. Lassen Sie uns die Eingabetaste drücken und sehen, dass wir das Verzeichnis geändert haben.

Aber jetzt geben wir ein:dir -rec -inc ConfigurationFile.ini

Sie hätten nach jedem Parameter die Tabulatortaste drücken und sehen können, wie sie sich in die korrekteren Versionen ausdehnen. Sie hätten auch Get-ChildItem verwenden können etwas strenger sein. Es ist mir jedoch egal. Wenn Sie dies ausführen, werden einige Dateien aufgelistet. Ich weiß nicht, wie viele du bekommst. Jedes zeigt an, dass Sie eine Installation von SQL Server ausgeführt haben. Aber als SQL-Experte wissen Sie das. Sie haben vielleicht nicht gewusst, wie einfach PowerShell sie für Sie auflisten könnte.

In Ordnung. Hoffentlich sehen wir dafür eine Verwendung.

Lassen Sie uns nun etwas mit dieser Ausgabe tun. Ich möchte „mit diesen Dateien“ sagen, aber machen wir die Datensache und stellen uns dies als einen Datensatz von Dateien vor.

Angenommen, wir wollen sie zählen. Ich könnte die Ergebnisse mit ForEach-Object durchlaufen (Aber ich werde die Abkürzung % verwenden ) und inkrementiere eine Variable, die ich eingerichtet habe. Dies ist ein gängiges Muster für Schleifen – Leute setzen ganze Programme über viele Zeilen hinweg in diese geschweiften Klammern.

Das macht den Trick, aber ich bin sicher, dass etwas eingebaut ist, mit dem ich Dinge zählen kann.

Nun, ich kann mich nie an diesen Befehl erinnern, also fragen wir einen dieser schicken Internetsuchanbieter.

Ich möchte diese Seiten gar nicht öffnen. Ich möchte nur darauf hinweisen, dass es einen Befehl namens Measure-Object gibt . Lassen Sie uns unsere Ausgabe dorthin leiten. Drücken Sie die Aufwärtspfeiltaste, um zu einem vorherigen Befehl zurückzukehren.

Dies dauert einen Moment und teilt uns dann fröhlich mit, dass es drei sind.

Es dauert einen Moment, da die Dateien erneut durchsucht werden müssen. Wie wäre es, wenn wir diese Ergebnisse irgendwo speichern?

Nun, ich nenne diese Dinge Klammern, aber die Amerikaner nennen sie Klammern. Und was Sie Klammern nennen, nenne ich eckige Klammern. Es gibt auch geschweifte Klammern, die Sie Klammern nennen, glaube ich. Ich werde versuchen, Klammern „runde Klammern“ zu nennen, um Verwirrung zu vermeiden, aber wenn ich mich auf eine „Klammer“ beziehe, meine ich eine Klammer.

Ich werde mein dir umschließen Befehl in runden Klammern und weisen Sie diesen einer Variablen zu.

Jetzt kann ich $configfilelist leiten in Measure-Object und es wird reaktionsschneller sein, weil ich meine Ergebnisse gespeichert habe.

Aber weil $configfilelist ein Array von Dateien ist, kann ich mir auch die Länge ansehen, um zu sehen, dass es drei Elemente gibt. Das ist viel einfacher. Und ich kann auf jeden einzelnen zugreifen, indem ich eckige Klammern von 0 bis 2 verwende.

Das ist noch nicht gerade bahnbrechendes Zeug. Aber diese Dateien sagen uns einige nützliche Dinge. Machen wir ein Get-Member Befehl auf unserem Array.

Lassen Sie sich davon nicht abschrecken. Oben sehen wir, dass wir es mit Objekten vom Typ System.IO.FileInfo zu tun haben . Dies ist eine .Net-Sache und daher kommt die Kraft. Wir können sehen, dass wir Delete aufrufen könnten Methoden dieser Dateien oder CopyTo , oder Decrypt (wenn sie verschlüsselt waren, aber nicht) und mehr. Unten sehen wir Eigenschaften.

Das ist interessanter. Schauen wir uns LastWriteTime an . Denn uns könnte interessieren, wann das ist.

Wir können Select-Object verwenden nur bestimmte Eigenschaften anzuzeigen.

Wie erwartet wurde nichts in diese Dateien geschrieben, da die Installationen tatsächlich durchgeführt wurden. Aber was wäre, wenn ich dies nur auf diejenigen seit einem bestimmten Zeitpunkt filtern wollte?

Ich werde Get-Date verwenden um das aktuelle Datum und die Uhrzeit zu erhalten. Ich werde das in runde Klammern setzen und seine AddYears verwenden Methode vor einem Jahr zu finden. In der realen Welt würde ich eher AddDays verwenden , aber ich möchte einige Ergebnisse erhalten.

Und ich werde $configfilelist filtern durch Übergabe an Where-Object (außer dass ich eine praktische Abkürzung verwenden werde, nämlich das Fragezeichen). Mein Filter befindet sich in geschweiften Klammern („Klammern“, richtig?), und in diesen geschweiften Klammern beziehe ich mich auf die Dinge in $configfilelist mit $_ .

Mein Filter sieht also so aus, dass ich diejenigen auflisten möchte, die eine LastWriteTime haben größer als (-gt ) vor einem Jahr:

Und ich bekomme nur eine Datei. Ausgezeichnet.

Das ist alles schön und gut, aber jetzt möchte ich wissen, worum es bei dieser Installation ging. Dazu müssen wir in die Datei schauen. Get-Content ist unser Freund hier. Beginnen wir mit Get-Content direkt gegen eine Datei. Es wird später einfach sein, es in unseren richtigen Befehl einzubinden.

Get-Content gibt tatsächlich ein Array von Zeilen zurück und hat wirklich nützliche Parameter wie -TotalCount die nach einer bestimmten Anzahl von Zeilen stoppt, oder -Tail was Zeilen am Ende der Datei bekommt. Ich liebe das, wenn ich mit großen Dateien arbeite – es ist nicht so, als könnte ich sie in Notepad öffnen.

Lassen Sie mich Ihnen etwas über erzählen Select-String zu. Es ist wie grep von Unix – Sie verwenden es, um die gewünschten Zeilen in einer Datei zu erhalten.

Diese Ausgabe scheint ein Schmerz zu sein, aber denken Sie daran, dass dies nur die Zeichenfolgendarstellung eines Objekts ist. Wenn ich meinen Befehl an gm weiterleite (Get-Member ), du wirst sehen, was ich meine.

Jetzt kann ich also sagen, dass ich auf den Path zugreifen kann der Datei, die Line , die LineNumber usw. getrennt.

Um nach mehreren Dingen zu suchen, möchte ich ein Array von Parametern an -Pattern übergeben . Ich mache das, indem ich einfach ein Komma verwende, um zu erkennen, dass es sich um eine Installation von Analysis Services handelt.

Hoffentlich beginnen Sie, die Kraft davon zu erkennen.

Ich kann alles in einer Zeile ablegen, indem ich Folgendes verwende:

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

(Entschuldigung, Sie müssen wahrscheinlich seitwärts scrollen, um das alles zu sehen – alles in einer einzigen Zeile zu haben, ist nicht gerade eine Tugend in HTML.)

Wenn Sie Dinge ausarbeiten, die Ihnen gefallen, möchten Sie die Befehle für später irgendwo speichern (z. B. in einer .ps1-Datei, die Sie ausführen). Dazu sollten Sie sich Get-History bewusst sein . Es listet alles auf, was Sie in dieser Sitzung ausgeführt haben.

Und ein netter kleiner Trick ist, dass Sie negative Zahlen verwenden können, um sich in Arrays vom anderen Ende einzuklinken. So können Sie Folgendes tun:

Aber anstatt es nur anzuzeigen, leiten Sie es in clip :

…was es in die Zwischenablage bringt.

Ich werde damit nicht viel weiter gehen, aber Sie könnten dies selbst immer weiter vorantreiben und die Arten von Dingen erkunden, die in Ihrem Job interessant sein könnten. Sie können Ergebnisse mit > in Dateien ausgeben und mit >> an Dateien anhängen .

Betrachten Sie nun Befehle wie:

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

… und stellen Sie sich vor, was Sie damit machen könnten.

Versuchen Sie Folgendes:Import-Module SQLServer

Was dich dann gehen lässt:

cd SQLSERVER:

Und durchsuchen Sie die SQL-Umgebung, als wäre es ein Dateisystem.

Ich neige dazu, PowerShell nicht sehr oft zu verwenden, um SQL so zu erkunden, muss ich zugeben. Aber die Tatsache, dass ich es kann, gibt mir sicherlich eine Reihe von Optionen. Die Tatsache, dass ich PowerShell verwenden könnte, um ein Word-Dokument zu erstellen, wie sie es unter https://learn-powershell.net/2014/12/31/beginning-with-powershell-and-word/ tun, oder E-Mails senden könnte, wie unter beschrieben https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage, oder rufen Sie Webdienste (einschließlich Azure Machine Learning) auf, wie unter https://docs.microsoft beschrieben .com/en-gb/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest bedeutet, dass Sie PowerShell mit etwas Fantasie verwenden können, um so ziemlich alles zu tun, was Sie wollen. Ich liebe es, Invoke-SqlCommand zu verwenden, um Daten aus SQL herauszuholen und sie in Invoke-WebRequest zu verschieben um Ergebnisse von Azure ML abzurufen und dann entsprechend zu reagieren. PowerShell macht es wirklich einfach.

Oh, und um PowerShell-Befehle auf anderen Computern auszuführen (was natürlich sehr nützlich sein kann), zeigte mir eine schnelle „Internetsuche“ diese nützlich aussehende Seite:https://www.howtogeek.com/117192/how-to -run-powershell-commands-on-remote-computers/

Sie könnten eine Liste von Computern in einer Datei haben und diese wie folgt durchlaufen:

Probieren Sie einige Sachen aus. Sich selbst umhauen. Und entdecken Sie, was alle diesen Monat für T-SQL Tuesday schreiben, moderiert von Rob Sewell (@sqldbawithbeard)

@rob_farley