Powershell

Powershell installieren

Zum installieren von Powershell auf Deinem System besuche https://github.com/PowerShell/PowerShell und folge der Anweisung.

Beachte bitte folgende Datei: https://github.com/PowerShell/PowerShell/blob/master/docs/KNOWNISSUES.md!

Warum Powershell

Powershell ist mit der Version 6 OpenSource Software geworden und unterstützt zahlreiche Plattformen wie Windows, iOS und alle gängige Linu-Plattformen (redhat, centos, Debian, Ubuntu etc.) und auch ARM-Prozessoren und Cloud-Anbieter wie Amazon, google und Azure von Microsoft. Der Vorteil liegt jetzt darin, dass man sich nicht mehr in einer hetrogenen Systemlanschaft auf jedes System einstellen muss, sondern alle Standardaufgaben in der gleichen Umgebung ausführen kann. Ebenfalls funktionieren geschriebene Skripte von einem Windowssystem auch auf allen anderen Systemen (wenn die Abhängigkeiten erfüllt sind).

Starten der Powershell

Mit dem Befehl

pwsh

wird die Powershell gestartet. Mit dem Befehl

exit

verlässt man die Powershell wieder.

Eine Übersicht der verfügbaren Befehle auf dem vorhandenen System bekommt man mit

get-command

Beim ausführen unter Ubuntu und Windows sieht man recht klar, welche Plattform am besten unterstützt wird.

Beispiel

Um den Inhalt eines Directory anzuzeigen, verwendet Powershell den Befehl

get-childitem

Powershell versucht nun die verschiedenen Befehle der unterschiedlichen Plattformen zu vereinheitlichen. Bei Windows gibt es den Befehl

dir

und bei Linux hingegen

ls

Beide Befehle funktionieren auch auf allen Plattformen unter der Powershell. Aber der eigentliche Befehl heißt

get-childitem

Hilfe

Die Powershell hat ein eingebautes Hilfesystem. Wenn wir uns beispielsweise alle Befehle anschauen möchten, die etwas mit den Prozessen auf unserem System zu tun haben:

> Get-Help *process*
                                                                                Name                              Category  Module                    Synopsis  ----                              --------  ------                    --------  Debug-Process                     Cmdlet    Microsoft.PowerShell.M... ...       Get-Process                       Cmdlet    Microsoft.PowerShell.M... ...       Start-Process                     Cmdlet    Microsoft.PowerShell.M... ...       Stop-Process                      Cmdlet    Microsoft.PowerShell.M... ...       Wait-Process                      Cmdlet    Microsoft.PowerShell.M... ...       Get-PSMetaConfigurationProcessed  Function  PSDesiredStateConfigur... ...       Set-PSMetaConfigDocInsProcesse... Function  PSDesiredStateConfigur... ... 

Wir suchen uns den Befehl Get-Process aus und möchten zu diesem Befehl mehr Informationen:

> get-help get-process                                                                                                                                  NAME                                                                                Get-Process                                                                 
SYNTAX
    Get-Process [[-Name] <string[]>] [-Module] [-FileVersionInfo]
    [<CommonParameters>]

    Get-Process [[-Name] <string[]>] -IncludeUserName  [<CommonParameters>]

Am Ende steht eventuell folgender Hinweis:

REMARKS
    Get-Help cannot find the Help files for this cmdlet on this computer. It
    is displaying only partial help.
        -- To download and install Help files for the module that includes
    this cmdlet, use Update-Help.
        -- To view the Help topic for this cmdlet online, type: "Get-Help
    Get-Process -Online" or
           go to https://go.microsoft.com/fwlink/?LinkID=113324.

Dort ist einmal der Hinweis, dass die Hilfe nicht komplett auf unserem System installiert ist und wir dies mit dem Befehl

update-help -force

tun können. Jetzt wird die Hilfe wesentlich ausführlicher. Des weiteren können wir den Link öffnen der unten angegeben ist und die Hilfe online lesen. Auf einem graphischen System könnten wir eingeben:

get-help get-process -online

Die Hilfe ist noch umfangreicher als die installierte Hilfe.

Die 4 Arten von Befehlen

Es gibt 4 Arten von Befehlen bei der Powershell:

1.) Administrative Befehle des Betriebssystems (ifconfig, ipconfig)

2.) Aliases wie dir und ls

3.) Skripte

4.) Cmdlets

Alias

Alias sind Verweise oder Verlinkungen auf andere Befehle. Beispielsweise verweise ls und dir auf den Befehl Get-ChildItem. Eine Liste aller Aliases kann angezeigt werden mit:

Get-Alias

Wir bekommen eine Liste aller Alliases und das Ziel des verweises angezeigt. Bitte beachte, dass bei Scripten auf Aliases verzichtet werden sollte, weil die Fehlersuche durch diese sehr erschwert wird.

Cmdlets

Aussprache: Command Lets

Cmdlets sind eine neue Kategorie von Befehlen die es so bisher weder unter Windows noch Unix gab. Sie sind daran zu erkennen, dass erst ein Verb kommt und dann ein Nomen. Wir schauen uns ein CMDlet an:

get-command

Wir bekommen eine Liste aller verfügbaren CMDlets in der Powershell angezeigt.

Cmdlets können von anderen Quellen installiert oder selbst programmiert werden. Sogenannte Snapins können sehr viele Cmdlets beinhalten (teilweise tausende). Verfügbar sind Snapins z.B. für VirtualBox, AWS, Azure etc.

Wir haben oben das Cmdlet Get-Process kennengelernt. Cmdlets können Parameter mit “-“ angehängt werden, erfordern aber niemal zwingend einen Parameter. Wir möchten z.B. nur die Prozessinformationen über die offenen Shells wissen:

Get-Process -name bash

Probiere den Befehl auch mit “Bash” aus. Ist die Powershell Casesensitive? Beachtet die Linux-Konsole Groß- und Kleinschreibung?

Verketten von Befehlen

Wir haben gesehen, dass wir mit

Get-Process -name bash

die aktiven Konsolen angezeigt bekommen. Jetzt möchten wie diese beenden:

Get-Process -name bash | Stop-Process

Unsere Sitzung wird beendet, weil wir den Prozess beendet haben. Das Zeichen

|

nennt man “pipe” und bedeutet Röhre. Die Ausgabe vom ersten Befehl wird wie in einer Röhre nicht auf dem Bildschirm angezeigt sondern an dem nachfolgeneden Befehl weitergeleitet. Der Unterschied zur Linuxkonsole ist, dass dies ein Objekt ist nicht die einfache Textausgabe. Dies erhöht die Flexibilität ernorm:

Get-Process  | Select-Object -property CPU

Property bedeutet Eigenschaft und zeigt in diesem Fall vom Objekt Get-Process die Eigenschaft der CPU an. Um das ganze lesbarer zu gestalten lassen wir uns den Namen ausgeben:

Get-Process  | Select-Object -property name, CPU

Wir können auch mehere Pipes hintereinander fügen. Es soll jetzt beispielsweise die Prozesse nach der CPU-Belastung sortiert werden und nur die 10 Prozesse angezeigt werden, die die CPU am meisten belasten:

Get-Process | Select-Object -property name, CPU|Sort-Object -descending CPU|Select-Object -first 10

Um sinnvolle Konstrukte aufzubauen, brauchen wir eine Übersicht über die Einzelheiten des Objekts:

Get-Process | Get-Member

Variable

Wir können das Objekt auch in einer Variable speichern. Eine Variable beginnt immer mit $:

$variable = Get-Process

Und auf die Variable, die das gesamte Objekt beinhaltet, den obigen Befehl anwenden;

$variable | Select-Object -property name, CPU|Sort-Object -descending CPU|Select-Object -first 10

Module

Wir können auch Module bzw. SnapIns installieren, die den Befehlsvorrat der PowerShell-Installation deutlich erweitern:

Install-Package -Name AzureRM.NetCore

Dateien

Um eine Ausgabe in eine Datei umzuleiten:

 Get-Process | Out-File -FilePath /home/user/process.csv

Bitte Pfad entsprechend anpassen. Die Ausgaber der Datei erfolgt mit:

cat process.csv

Eine Kodierung kann mit angegeben werden, ist aber sehr umständlich:

$encoding = New-Object System.Text.utf8encoding
Get-Process | Out-File -FilePath /home/user/process.csv -Encoding $encoding

Selbstverständlich könnte man den Befehl auch in eine Zeile schreiben. Die Verwendung der Variable dient nur dazu, zu verdeutlichen, welcher Teil die Kodierung vornimmt.

Aufgabe

Entwickle eine Befehlszeile, die die aktuelle, lokale Netzwerkkonfiguration als .xml in eine Datei speichert (export-Clixml). Lass Dir die Datei auf dem Bildschirm erscheinen.

Erstes Script

Wir legen eine Datei an mit dem Namen erst.ps mit folgendem Inhalt:

write-host "FBS ist cool"

Installoiert dafür testhalber das Programm Visual Studio Code, das eine integrierte PowerShell hat.