Die Power von PowerShell, Teil 2

Im ersten Teil habe ich Ihnen einige interessante Dinge gezeigt, die Sie mit PowerShell machen können, die Geschichte von PowerShell behandelt und die Möglichkeiten von PowerShell als starke Skriptsprache, die prozessuale, funktionale und objektorientierte Programmierung unterstützt, eingehend erörtert. 

In Teil zwei werde ich die interaktive Shell, das Profil und die Eingabeaufforderung besprechen und PowerShell mit Bash vergleichen.

PowerShell: Die interaktive Shell

PowerShell wurde von Anfang an als interaktive Shell für Windows-Administratoren und Power-User entwickelt. Es konzentriert sich auf wenige Konzepte, sehr konsistente Erfahrung und eine Objekt-Pipeline, um Befehle zu verketten und zu kombinieren, sie zu filtern und zu formatieren. Das starke Hilfesystem, das sich auch an ein einheitliches Format hält, ist eine Freude für die Anwendung.

Lassen Sie uns einige davon in Aktion sehen.

Hilfe bekommen

Das umfassende Hilfesystem ist über zugänglich Hilfe erhalten.

PS C: \ WINDOWS \ system32> Hilfe Invoke-WebRequest NAME Invoke-WebRequest SYNOPSIS Ruft Inhalt von einer Webseite im Internet ab. SYNTAX Invoke-WebRequest [-Uri]  [-Karosserie ] [-Zertifikat ] [- ZertifikatThumbprint ] [-Inhaltstyp ] [-Gerechtigkeit ] [-DisableKeepAlive] [-Headers ] [-Im Ordner ] [-MaximumRedirection ] [-Methode Default | Holen Sie sich | Kopf | Beitrag | Setzen Sie | Löschen | Trace | Optionen | Zusammenführen | Patch] [-OutFile ] [-PassThru] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-SessionVariable ] [-TimeoutSec ] [-TransferEncoding chunked | komprimieren | entlüften | gzip | identity] [-UseBasicParsing] [-UseDefaultCredentials] [-UserAgent ] [-WebSession ] [] BESCHREIBUNG Das Cmdlet Invoke-WebRequest sendet HTTP-, HTTPS-, FTP- und FILE-Anforderungen an eine Webseite oder einen Webdienst. Es analysiert die Antwort und gibt Sammlungen von Formularen, Links, Bildern und anderen wichtigen HTML-Elementen zurück. Dieses Cmdlet wurde in Windows PowerShell 3.0 eingeführt. RELATED LINKS Online Version: http://go.microsoft.com/fwlink/?LinkId=821826 Invoke-RestMethod ConvertFrom-Json ConvertTo-Json ANMERKUNGEN Geben Sie Folgendes ein, um die Beispiele anzuzeigen: "get-help Invoke-WebRequest -examples" Um weitere Informationen zu erhalten, geben Sie Folgendes ein: "get-help Invoke-WebRequest -detailed". Geben Sie für technische Informationen Folgendes ein: "get-help Invoke-WebRequest -full". Geben Sie für die Online-Hilfe Folgendes ein: "get-help Invoke-WebRequest -online"

Um genauere Hilfe und Beispiele zu erhalten, verwenden Sie die richtigen Schalter: -Beispiele, -Einzelheiten, oder -voll.

Wenn Sie nicht sicher sind, wie der Befehlsname lautet, verwenden Sie einfach Schlüsselwörter. In PowerShell werden alle verfügbaren Befehle angezeigt, die dieses Schlüsselwort enthalten. Sehen wir uns an, welche mit CSV verbundenen Cmdlets verfügbar sind:

PS C: \ Benutzer \ the_g> Get-Help - Category Cmdlet csv | Name auswählen Name ---- ConvertFrom-Csv ConvertTo-Csv Export-Csv Import-Csv 

Ich habe eine kleine Pipeline erstellt, bei der ich den Aufruf von Get-Help nur auf das Cmdlet der Kategorie beschränkt und dann an das "select" (Alias ​​für Select-Object) weitergeleitet hat, um nur die Eigenschaft "name" zu erhalten.

Mit Dateien und Verzeichnissen arbeiten

Sie können so ziemlich alles, was Sie gewohnt sind: Navigieren in verschiedene Verzeichnisse, Auflisten von Dateien und Unterverzeichnissen, Untersuchen des Inhalts von Dateien, Erstellen von Verzeichnissen und Dateien usw..

PS C: \ Benutzer \ the_g> mkdir test_dir | select name Name ---- test_dir PS C: \ Benutzer \ the_g> cd. \ test_dir PS C: \ Benutzer \ the_g \ test_dir> "123"> test.txt PS C: \ Benutzer \ the_g \ test_dir> ls | name Name ---- test.txt PS C: \ Benutzer \ the_g \ test_dir> get-content. \ test.txt 123

Mit anderen Anbietern arbeiten

Mit PowerShell können Sie viele Dinge als Dateisysteme behandeln und mit ihnen navigieren CD und überprüfen Sie deren Inhalt mit ls / dir. Hier einige zusätzliche Anbieter:

Provider Drive Data Store -------- ----- ------------ Alias ​​Alias: Windows PowerShell-Aliase Certificate Cert: x509-Zertifikate für digitale Signaturen Umgebung Umgebung: Windows-Umgebungsvariablen Funktion Funktion: Windows PowerShell-Funktionen Registry HKLM :, HKCU: Windows-Registrierungsvariable Variable: Windows PowerShell-Variablen WSMan WSMan: WS-Management-Konfigurationsinformationen 

Schauen wir uns die Umgebung an und sehen Sie, welche Umgebungsvariablen von Go (auf meinem Computer) verfügbar sind:

PS C: \ Benutzer \ the_g> ls env: GO * Name Wert ---- ----- GOROOT C: \ GO \ GOPATH C: \ Benutzer \ the_g \ Documents \ Go 

Formatierung

PowerShell empfiehlt das Erstellen von Cmdlets mit Standard-Switches und das Erstellen von Pipelines. Die Formatierung ist ein explizites Konzept, bei dem Sie am Ende einer Pipeline einen Formatierer einfügen. PowerShell untersucht standardmäßig den Typ des Objekts oder der Objekte am Ende der Pipe und wendet einen Standardformatierer an. Sie können es jedoch überschreiben, indem Sie selbst einen Formatierer angeben. Formatierer sind nur Cmdlets. Hier ist die vorherige Ausgabe im Listenformat:

PS C: \ Benutzer \ the_g> ls env: GO * | Format-Listenname: GOROOT Wert: C: \ Go \ Name: GOPATH Wert: C: \ Benutzer \ the_g \ Documents \ Go 

Das Profil

Benutzer, die die Befehlszeile verwenden, haben häufig viele Aufgaben, Pipelines und bevorzugte Kombinationen von Befehlen mit Standardschaltern, die sie bevorzugen. Das PowerShell-Profil ist eine PowerShell-Skriptdatei, die bei jedem Start einer neuen Sitzung geladen und ausgeführt wird. Sie können alle Ihre Lieblings-Goodies dort ablegen, Aliase und Funktionen erstellen, Umgebungsvariablen festlegen und so ziemlich alles andere.

Ich möchte Navigationsaliasnamen für tief verschachtelte Verzeichnisse erstellen, virtuelle Umgebungen von Python aktivieren und Verknüpfungen zu externen Befehlen erstellen, die ich häufig ausführen, wie git und docker.

Für mich ist das Profil unverzichtbar, da die sehr lesbaren und konsistenten Befehle und Schalter von PowerShell oft zu ausführlich sind und die integrierten Aliasnamen oft mehr Probleme als Hilfe bieten (ich bespreche das später). Hier ist ein sehr unvollständiger Ausschnitt aus meinem Profil:

# --------------------------- # # DOCKER # # ----------------- ---------- Set-Alias ​​-Name d -Value Docker-Funktion di d images # ------------------------ --- # # GIT # # --------------------------- Set-Alias ​​-Name g -Value git-Funktion gs g status Funktion gpu g pull --rebase # ------------------------- # # CONDA # # ---------- --------------- Funktion a enable.ps1 $ args [0] # ---------------------- - # # NAVIGATION # # ------------------------ function cdg cd $ github_dir # MVP-Funktion cdm a ov; cdg; cd MVP # Backend-Funktion cdb a ov; cdg; cd backend # scratch function cds a ov; cdg; cd scratch # Backend-Pakete function cdbp cdb; cd packages # Go-Arbeitsbereich-Funktion cdgo cd $ go_src_dir

Die Aufforderung 

In PowerShell können Sie Ihre Eingabeaufforderung anpassen. Sie müssen eine aufgerufene Funktion definieren Prompt(). Sie können die integrierte Eingabeaufforderungsfunktion sehen:

PS C: \ Users \ the_g> gc-Funktion: Eingabeaufforderung "PS $ ($ executionContext.SessionState.Path.CurrentLocation) $ ('>' * ($ nestedPromptLevel + 1))"; # .Link # http://go.microsoft.com/fwlink/?LinkID=225750 # .ExternalHelp System.Management.Automation.dll-help.xml PS C: \ Users \ the_g> 

Hier ist eine benutzerdefinierte Aufforderungsfunktion, die die aktuelle Uhrzeit zusätzlich zum aktuellen Verzeichnis anzeigt:

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

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

Sie können natürlich wild gehen, Farben hinzufügen und verschiedene Bedingungen prüfen, z. B. ob Sie sich in einem bestimmten Git-Repository befinden oder ob Sie Administrator sind.

Aliase: Die dunkle Seite

Meiner Meinung nach hat PowerShell Aliasnamen an zwei verschiedenen Fronten falsch gemacht. Zuerst die alias Befehl erlaubt nur das Umbenennen von Befehlen. Sie können keine allgemeinen Flags oder Optionen hinzufügen, um Befehle nützlicher zu machen, indem Sie sie an sich selbst abändern.

Wenn Sie z. B. Zeile für Zeile in Text suchen möchten, können Sie das verwenden Select-String Cmdlet:

# Erstellen Sie eine kleine Textdatei mit 3 Zeilen "@ ab cd ef @"> 1.txt # Suchen Sie nach einer Zeile mit d Get-Content 1.txt | Select-String d cd

Das funktioniert, aber viele Leute möchten gerne umbenennen Select-String zu grep. Aber grep unterscheidet standardmäßig zwischen Groß- und Kleinschreibung Select-String ist nicht. Keine große Sache - wir fügen einfach das hinzu -CaseSensitive Flagge wie in:

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

Das funktioniert leider nicht:

16:19:26 C: \ Users \ the_g> Get-Content 1.txt | grep D grep: Der Begriff 'Select-String -CaseSensitive' wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens oder überprüfen Sie, ob der Pfad korrekt ist, und versuchen Sie es erneut. An Zeile: 1 Zeichen: 21 + Get-Content 1.txt | grep D + ~~~~ + CategoryInfo: ObjectNotFound: (Select-String -CaseSensitive: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException 

Der Wert eines Alias Muss entweder ein Cmdlet, eine Funktion, ein Skript oder ein Programm sein. Es sind keine Flags oder Argumente erlaubt. 

In PowerShell ist dies jetzt sehr einfach möglich. Sie müssen jedoch Funktionen und keine Aliasnamen verwenden. Das beschränkt die Aliase ziemlich auf das einfache Umbenennen, was auch von Funktionen ausgeführt werden kann.

PowerShell vs. Bash

Auf der interaktiven Shell-Seite sind PowerShell und Bash ziemlich gleichwertig. Standardmäßig ist Bash übersichtlicher, aber die Objektpipeline von PowerShell macht komplizierte Pipelines einfacher zu verwalten. ,

Das heißt, Sie können wahrscheinlich alles erreichen, und wenn Sie ein Power-User sind, haben Sie Ihre eigenen Aliase, Funktionen und Verknüpfungen für allgemeine Aufgaben. Auf der Skriptseite geht PowerShell weit über Bash hinaus und übertrifft bei der Systemadministration sogar Python, Ruby und Freunde. 

Ein wichtiger Aspekt ist die Verfügbarkeit. Bash ist bei den meisten * nix-Distributionen (sofern nicht ausdrücklich entfernt), einschließlich macOS, vorinstalliert. Es kann auch unter Windows über cygwin, git-bash oder msys installiert werden. PowerShell ist unter Windows vorinstalliert und erst vor kurzem auf Mac und Linux verfügbar.

Fazit

Wenn Sie Windows als Entwicklungscomputer verwenden oder Windows-Computer verwalten, ist PowerShell ein unverzichtbares Werkzeug. Es ist wirklich ein gut durchdachtes Superset der Unix-Shells und wird vorinstalliert geliefert. 

PowerShell bietet großartige Softwareentwicklung bei der Arbeit. Es entwickelte sich über ein Jahrzehnt und es wurde ständig weiterentwickelt, wobei die ursprüngliche konzeptionelle Integrität erhalten blieb. Die jüngste Umstellung auf Open Source und plattformübergreifend signalisiert, dass noch viel zu warten ist.