PowerShell

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Windows PowerShell)
Wechseln zu: Navigation, Suche
PowerShell
PowerShell 5.0 icon
Windows PowerShell
Screenshot der powershell.exe 5.0 unter Windows 8.1
Basisdaten
Entwickler Microsoft
Aktuelle Version 5.1
(2. August 2016)
Aktuelle Vorabversion 6.0.0 (Alpha-Version) [1]
Betriebssystem Microsoft Windows, Version 6 auch Linux und macOS
Kategorie Kommandozeileninterpreter
Lizenz Proprietär, MIT-Lizenz [2]
deutschsprachig ja
PowerShell

PowerShell (auch Windows PowerShell und PowerShell Core) ist ein plattformübergreifendes Framework von Microsoft zur Automatisierung, Konfiguration und Verwaltung von Systemen, bestehend aus einem Kommandozeileninterpreter, sowie einer Skriptsprache. [3]

PowerShell Core (auch PSCore) basiert auf der .NET Core Common Language Runtime (CoreCLR) und ist seit 2016 als plattformübergreifendes Open Source-Projekt[4] unter der MIT-Lizenz[2] für Linux, macOS und Windows verfügbar.[5]

Windows PowerShell basiert auf der Common Language Runtime (CLR) des .NET Framework und wird mit Windows als Teil des Windows Management Framework (WMF) unter einer proprietären Lizenz ausgeliefert.[5][6] Seit 2016 gibt es auch die Windows PowerShell als Core Edition, welche wie PowerShell Core auf .NET Core basiert und als Teil von Windows Nano Server und Windows IoT ausgeliefert wird.[7]

Entstehungsgeschichte[Bearbeiten | Quelltext bearbeiten]

Eingabeaufforderung[Bearbeiten | Quelltext bearbeiten]

Jede veröffentlichte Version von MS-DOS und Microsoft Windows enthielt eine Kommandozeile oder Eingabeaufforderung (siehe auch Kommandozeileninterpreter). Diese sind COMMAND.COM (in DOS bzw. DOS-basierten Betriebssystemen wie Windows 9x) und cmd.exe (in Betriebssystemen der Windows NT-Familie). Die Eingabeaufforderung bietet einige Standardbefehle und ermöglicht das Ausführen weiterer Konsolenanwendungen. Darüber hinaus gibt es eine Skriptsprache um Aufgaben zu automatisieren (siehe BAT-Datei). Da jedoch nicht alle Funktionalitäten der Grafischen Benutzeroberfläche über die Eingabeaufforderung erreichbar sind, können nicht alle Aufgaben automatisiert werden und auch die Skriptsprache ist aufgrund ihrer Einfachheit in der Funktionalität beschränkt. Mit Windows Server 2003 waren die meisten Funktionen auch per Eingabeaufforderung verfügbar, dennoch bleibt die Limitierung der Skriptsprache sowie Inkonsistenzen in der Bedienung unterschiedlicher Konsolenanwendungen.

Microsoft versuchte bereits 1998 einige dieser Limitierungen mit der Einführung von Windows Script Host (cscript.exe) und dessen Unterstützung von JScript und VBScript in Windows 98 zu adressieren. Mit Windows Script Host ist es möglich, alle COM-Komponenten anzusprechen, was die Automatisierung von weiten Teilen des Betriebssystem ermöglicht. Doch Windows Script Host richtet sich eher an Skriptentwickler und eignet sich weniger für die (ad-hoc) Administration, die Dokumentation war nicht leicht zugänglich und wurde schnell von Computerviren missbraucht. Darüber hinaus gibt es in unterschiedlichen Windows-Versionen weitere Kommandozeileninterpreter für spezielle Einsatzgebiete (z. B. netsh zur Netzwerkkonfiguration oder das Windows Management Instrumentation Command-line (WMIC)).

Monad Manifest[Bearbeiten | Quelltext bearbeiten]

Jeffrey Snover – ein Verfechter von Kommandozeilen, der 1999 bei Microsoft anfing – unterstützte zunächst Microsoft Windows Services for UNIX (SFU) um Unix-Tools unter Windows nutzen zu können. Da Windows aber nicht wie Unix dokumentenorientiert, sondern API-orientiert arbeitet, konnte es letztlich nicht umfassend verwaltet werden (z.B. Setzen von Registry-Werten). Snover entwickelte außerdem die Windows Management Instrumentation Command-line (WMIC).[8] 2002 beschrieb er einen neuen Ansatz für die Automatisierung in Windows als Monad Manifest. Darin beschreibt Snover Monad als mächtige, konsistente, erweiterbare und nützliche „Plattform der nächsten Generation“ auf Basis von .NET, mit der der Aufwand für Administratoren reduziert und das Leben von Nicht-Programmierern deutlich vereinfacht werden könne.[9] Dies sollte unter anderem durch folgende Punkte erreicht werden:

  • Administratoren können Befehle schneller und einfacher programmieren, da Monad viele Standardaufgaben von Befehlen übernimmt und durch einen einheitlichen Parser Konsistenz bietet.
  • Anstatt Text (unstrukturierte Daten) werden Objekte (strukturierte Daten) an die Pipe übergeben, was die Weiterverarbeitung vereinfacht.
  • Ausführung von Skripts auf einer Vielzahl von entfernten Computern
  • Die Möglichkeit GUIs nutzen zu können

Die Idee von Monad wurde weiterentwickelt. 2003 bei der Professional Development Conference in Los Angeles wurde erstmals die Monad Shell (MSH) gezeigt. 2005 wurden Beta-Versionen veröffentlicht.

PowerShell entsteht und wird Teil von Windows[Bearbeiten | Quelltext bearbeiten]

2006 verkündete Microsoft, dass Monad in PowerShell umbenannt werde. Gleichzeitig wurde verkündet, dass Exchange Server 2007 per PowerShell administriert werde und auch die GUI auf PowerShell aufsetze.[10] Noch im gleichen Jahr wurde PowerShell 1.0 veröffentlicht und zum Download angeboten.[11]

Durch die Unterstützung der Exchange- und Datacenter-Verantwortlichen bei Microsoft konnte die PowerShell im Konzern etabliert werden.[12] 2007 wurde PowerShell Teil von Microsofts Common Engineering Criteria für 2009, einer Liste von Kriterien, der jedes Microsoft Server-Produkt entsprechen soll. Das bedeutete effektiv, dass ab 2009 jedes Server-Produkt von Microsoft PowerShell unterstützen sollte.[13] Dies war der endgültige Durchbruch für PowerShell als zentrale Verwaltungs- und Automatisierungseinheit in Windows.

2008 wurde Windows Server 2008 das erste Betriebssystem, das mit PowerShell ausgeliefert wird – jedoch noch als optionale Komponente.

2009 wurde PowerShell 2.0 als fester Bestandteil von Windows 7 und Windows Server 2008 R2 veröffentlicht.[14] Anfang 2010 stand PowerShell 2.0 auch für ältere Betriebssysteme als optionales Update per Windows Update bereit.[15]

PowerShell wird Open Source und plattformübergreifend[Bearbeiten | Quelltext bearbeiten]

2016 verkündet Microsoft, dass PowerShell unter der MIT-Lizenz Open Source und plattformübergreifend entwickelt wird.[16] Gleichzeitig wird ein Github Repository erstellt und die Alpha-Version von PowerShell Version 6.0 für Windows, Linux und macOS veröffentlicht. Der Hersteller begründet diesen Schritt in seiner Cloud-Strategie. In Microsoft Azure werden nicht nur Windows-, sondern auch eine Vielzahl von Linux-Systemen bereitgestellt. Microsoft möchte PowerShell als universelles Werkzeug für alle Administratoren anbieten, ganz gleich welches Betriebssystem oder welche Anwendung administriert werden soll.

Aufbau[Bearbeiten | Quelltext bearbeiten]

PowerShell wurde speziell für die Systemverwaltung und -automatisierung entworfen[17]

Sie verbindet die aus Unix-Shells bekannte Philosophie von Pipes und Filtern mit dem Paradigma der objektorientierten Programmierung. Der Benutzer kann wie bisher einfache Befehle an einer Kommandozeile ausführen und miteinander verknüpfen oder aber auch komplexe Skript-Programme mit der eigens dafür entwickelten PowerShell Scripting Language schreiben.

Die PowerShell erlaubt Zugriff auf WMI-Klassen, COM-Objekte sowie auf das gesamte .NET-Framework.

PowerShell Engine[Bearbeiten | Quelltext bearbeiten]

Die PowerShell Engine (auch Shell, PowerShell Class oder PowerShell Runtime) ist der Kommandozeileninterpreter, der die Eingaben verarbeitet und damit das Herz der PowerShell. Die Engine ist eine Sammlung von .NET Framework-Klassen, die in einer DLL (System.Management.Automation.dll) gespeichert sind.

PowerShell Host[Bearbeiten | Quelltext bearbeiten]

Der PowerShell Host ist das Benutzerschnittstelle zur PowerShell Engine. In Windows steht standardmäßig die Windows PowerShell (auch Konsole) (powershell.exe) und Windows PowerShell ISE (Integrated Script Environment, kurz ISE) (powershell_ise.exe) zur Verfügung. Die ISE ist ein modernes Eingabefenster mit unter anderem integriertem Skripteditor, Debugger und IntelliSense. Beide Hosts erlauben es auch herkömmliche Kommandozeilenanwendungen auszuführen, wie Beispielsweise ipconfig.exe. Jedoch erlaubt die ISE keine Interaktion, wie zum Beispiel bei nslookup.exe. Die ISE kann durch Add-ons erweitert werden, eine bekannte Erweiterung ist ISESteroids. Auch Verwaltungskonsolen wie etwa die Exchange Management Console (EMC) seit Exchange Server 2007 sind ein Host. Darüber hinaus gibt es auf dem Markt weitere Hosts, wie PowerShell Plus von Idera. Zwar nutzen alle Hosts dieselbe Engine, doch da die Implementierung unterschiedlich sein kann, ist es auch möglich dass sich die Hosts untereinander unterschiedlich verhalten.

PowerShell Scripting Language[Bearbeiten | Quelltext bearbeiten]

Die PowerShell Scripting Language ist die Sprache um Skripte für die PowerShell Engine zu entwickeln. Seit Version 2.0 kann die Skriptsprache auch verwendet werden um eigene Cmdlets zu erstellen. Mit Version 5 wurde die Skriptsprache um Klassen erweitert.

Anders als bei bisher existierenden objektorientierten Skript-Interpretern (BeanShell, Smalltalk, Python Shell) ist die Syntax der PowerShell-Skriptsprache, welche sich unter anderem Anleihen bei Perl, Unix-Shells, SQL und C# nimmt, darauf ausgelegt, auch für den täglichen interaktiven Gebrauch als Shell für administrative Aufgaben wie etwa Dateiverwaltung geeignet zu sein.

Cmdlets[Bearbeiten | Quelltext bearbeiten]

Cmdlets (gesprochen Commandlets) werden die Befehle in einer PowerShell-Umgebung genannt. Der Begriff soll verdeutlichen, dass es sich um sehr kleine, spezielle Befehle handelt, etwa wie in Befehlchen. Im Gegensatz zu herkömmlichen Befehlen, sind Cmdlets keine Stand-Alone Anwendungen, das heißt sie können nicht ohne die PowerShell ausgeführt werden. Cmdlets können .NET Framework-Klasse (Objektorientierung) oder PowerShell-Skripte sein und mit wenigen Zeilen Programmcode geschrieben werden. Cmdlets parsen Eingaben in der Regel nicht selber, stellen Fehler nicht selbst dar und geben Ergebnisse unformatiert als Objekt wieder.[18] Die PowerShell Engine bzw. Standard-Cmdlets nehmen Cmdlet-Entwicklern arbeit von Standardaufgaben ab und vereinfacht und beschleunigt die Entwicklung. Gleichzeitig wird die Nutzbarkeit und Lesbarkeit von Skripten und Befehlen durch sehr strikte und ausführliche Namenskonventionen gewährleistet.

Cmdlets folgen dem Namensschema Verb-Substantiv, also beispielsweise Get-Help oder Set-Location. Cmdlets sind durch das vorangestellte Verb aufgabenorientiert, sollen genau eine spezifische Aufgabe erfüllen und nur einen Objekttyp ausgeben, wie zum Beispiel Get-Process, das alle laufenden Prozesse auflistet und als Objekt vom Typ System.Diagnostics.Process ausgibt. Das Beenden von Prozessen ist eine eigene Aufgabe und ist daher ein eigenes Cmdlet (Stop-Process). Das Auflisten von Diensten gibt andere Eigenschaften als bei Prozessen aus und hat daher ein anderes Substantiv (Get-Service). Die resultierenden Objekte können sodann weiterverarbeitet werden. So ist es möglich Objekte zu filtern (Select-Object -Property Name,Status, Where-Object -Property Status -EQ -Value Stopped), konvertieren (Converto-Json) oder auszugeben (Out-File, Out-GridView).

Microsoft hat eine Liste mit erlaubten Verben veröffentlicht. Die Einhaltung der Verben wird nicht technisch erzwungen, jedoch empfohlen um eine einheitliche Benutzererfahrung zu bekommen und die Bedienung so zu erleichtern. [19] Die Liste der freigegebenen Verben kann mit Get-Verb abgerufen werden.

Für Cmdlets können Aliase hinterlegt werden, etwa um Kompatibilität zu alten Skripten herzustellen, es Umsteigern von anderen Systemen leichter zu machen oder einfach Befehle mit weniger Buchstaben ausführen zu können. Einige dieser Aliase werden bereits durch Module vordefiniert, so wird Beispielsweise das Cmdlet Set-Location verwendet um das aktuelle Verzeichnis des Hosts zu definieren, es sind doch auch die Aliase sl, cd und chdir verwendbar.

Die folgende Tabelle stellt eine Auswahl von Standard-Cmdlets mit Aliasen und vergleichbaren Befehlen anderer Kommandozeileninterpreter gegenüber.

PowerShell
Cmdlet
PowerShell
Version
PowerShell
Alias
cmd.exe
Unix-Shell Beschreibung
Get-Help 1.0 [20] help, man help man Hilfe zu Befehlen
Get-Command 1.0 [20] gcm Listet alle im derzeitigen Kontext verfügbaren Befehle und Aliase auf.
Get-Alias 1.0 [20] gal alias Listet Aliase für Befehle auf.
Get-Location 1.0 [20] gl, pwd cd pwd Ausgabe des aktuellen Verzeichnisses
Set-Location 1.0 [20] sl, cd, chdir cd, chdir cd Wechseln des aktuellen Verzeichnisses
Clear-Host 3.0 [21] cls, clear cls clear Löschen der Ausgabe
Copy-Item 1.0 [20] cpi, copy, cp copy cp Kopieren einer oder mehrerer Dateien / eines ganzen Verzeichnisbaums
Remove-Item 1.0 [20] ri, del, erase, rmdir, rd, rm del, rmdir, rd rm, rmdir Löschen einer Datei / eines Verzeichnisses
Rename-Item 1.0 [20] rni, ren ren mv Umbenennen einer Datei / eines Verzeichnisses
Move-Item 1.0 [20] mi, move, mv move mv Verschieben einer Datei / eines Verzeichnisses
Get-ChildItem 1.0 [20] gci, dir, ls dir ls Liste aller Dateien / Verzeichnisse im (aktuellen) Verzeichnis
Write-Host 1.0 [20] echo, write echo echo Ausgabe von Zeichenketten, Variablen etc. in der Konsole
Pop-Location 1.0 [20] popd popd popd In Verzeichnis wechseln, welches zuletzt auf dem Stack abgelegt wurde
Push-Location 1.0 [20] pushd pushd pushd Verzeichnis auf dem Stack ablegen
Set-Variable 1.0 [20] sv, set set set Wert einer Variable setzen / Variable anlegen
Start-Process 2.0 [22] saps start Startet ein Programm im eigenen Fenster
Get-Content 1.0 [20] gc, type, cat type cat Ausgabe einer Datei
Select-String 1.0 [20] sls find, findstr grep Suche und Filterung definierter Zeichenketten
Get-Process 1.0 [20] gps, ps tlist,[23][24] tasklist [25] ps Liste aller momentan laufenden Prozesse
Stop-Process 1.0 [20] spps, kill kill,[23][26] taskkill [27] kill Beenden eines laufenden Prozesses
Stop-Computer 2.0 [22] shutdown shutdown, poweroff Herunterfahren des Rechners
Restart-Computer 2.0 [22] shutdown -r reboot, shutdown -r Neustart des Rechners
Tee-Object 1.0 [20] tee tee Standardeingabe in eine Datei oder Variable umleiten und entlang der Pipeline weiterreichen (Standardausgabe)
Get-NetIPAddress 3.0 [28] gip ipconfig ifconfig Listet die Netzwerkschnittstellen mit Konfigurationsinformationen auf
Get-Acl 1.0 [20] acl Listet die Zugriffsberechtigungen eines Ordners oder Dokuments auf.
Get-Member 1.0 [20] gm Listet die Mitglieder (Member-Variablen) eines Objektes auf.
Get-PSSnapin 1.0 [20] gsnp Listet die aktiven PowerShell-Erweiterungen auf.
Export-Console 1.0 [20] export Exportiert die aktive Konfiguration der Konsole in eine Datei.
Eine neue PowerShell-Instanz kann diese Konfiguration über den Parameter -psconsolefile <String> beim Start laden.

Parameter werden nach dem Cmdlet mit -Parametername [Wert] angegeben. Ein Parameter kann unterschiedliche Eigenschaften besitzen, so kann er Beispielsweise einen Standardwert haben, erforderlich oder positionsbezogen sein oder Werte aus der Pipe akzeptieren. Welche Parameter für ein Cmdlet verfügbar sind und welche Eigenschaften sie besitzen kann mit Get-Help geprüft werden (z.B. Get-Help -Name Get-NetIPAddress -Parameter *). Zusätzlich zu Cmdlet-spezifischen Parametern gibt es auch sogenannte Common Parameter, also allgemein verfügbare Parameter. Dazu zählt -Verbose zur Ausgabe von Detailinformationen, -ErrorAction um festzulegen wie bei einem Fehler verfahren werden soll oder -WhatIf um sich ausgeben zu lassen, was passieren würde wenn man den Befehl ausführt, ohne das tatsächlich Änderungen gemacht werden.

Module sind die bevorzugte Art um Cmdlets zu veröffentlichen und in PowerShell zu laden. Module bestehen aus dem Cmdlet-Programmcode (als PowerShell-Skript oder .NET Framework-Klasse) und einem Manifest, welches den Inhalt des Moduls beschreibt.[29] In PowerShell 1.0 war es ausschließlich über PSSnapins (Snap-ins) möglich Cmdlets zu laden. Dies wurde jedoch durch Funktion der Module ersetzt.[30]

PowerShell Provider[Bearbeiten | Quelltext bearbeiten]

PowerShell Provider (auch PSProvider) bieten dem Zugriff auf auf Daten und Komponenten (Namensräume) die sonst nicht einfach über den Host abrufbar wären und Präsentieren die Daten in einem konsistenten Format als Laufwerke. Das bekannteste Beispiel dafür ist das Dateisystem, welches eine Partition als Laufwerk C darstellt. Es sind jedoch auch weitere Provider möglich, wie etwa Variablen, die Registry, Active Directory und der Zertifikatsspeicher. In allen Laufwerken (zum Beispiel C:, D:, Env:, HKLM: oder Cert:) kann gleichermaßen Navigiert oder Elemente verarbeitet werden (Set-Location, Get-ChildItem, Remove-Item, ...).

Liste von Providern[Bearbeiten | Quelltext bearbeiten]

Folgende Liste zeigt einige der Standardprovider in PowerShell.

Name Typ Aufgabe
Alias Container Bindet ein logisches Laufwerk mit dem Namen „Alias:“ ein. Über dieses Laufwerk lassen sich als Schlüssel-Wert Paare definierte Alias (etwa mit Get-ChildItem Alias:) abrufen.
Environment Container Bindet ein logisches Laufwerk mit dem Namen „env:“ ein. Über dieses Laufwerk lassen sich die Umgebungsvariablen abfragen.
FileSystem Navigation Über den FileSystem Provider wird der Zugriff auf das Dateisystem ermöglicht. Über den FileSystem-Provider können Laufwerke, Wechseldatenträger, Netzlaufwerke, u.ä., sowie die darauf befindlichen Dateien und Ordner zugegriffen werden. Laufwerke werden dabei jedoch nicht als logisches Laufwerk in PowerShell integriert, sondern als Referenz im Function-Provider hinterlegt.
Function Container Verwaltet Funktionen, welche mit New-Item erstellt oder in einem PowerShell-Skript deklariert wurden.
Registry Navigation Ermöglicht unter Windows den Zugriff auf die Registrierungsdatenbank. Standardmäßig werden die Laufwerke „HKLM:“ (für HKEY_LOCAL_MACHINE) und „HKLU:“ (für HKEY_LOCAL_USER) erstellt. Weitere Laufwerke lassen sich bei Bedarf mit New-PSDrive (z. B. New-PSDrive -name HKU -psprovider Registry -root HKEY_USERS) anlegen.
Variable Container Verwaltet die im PowerShell-Host erstellten Variablen und deren Werte und bindet diese als logisches Laufwerk „Variable:“ ein.
Certificate Navigation Verwaltet die Sicherheitszertifikate des Systems und bindet sich als logisches Laufwerk „Cert:“ ein. Der Certificate-Provider wird von Get-PSProvider nicht aufgelistet.

Versionen[Bearbeiten | Quelltext bearbeiten]

PowerShell 1.0[Bearbeiten | Quelltext bearbeiten]

Die erste Version von PowerShell erscheint 2006 als ein Grundgerüst mit den wichtigsten Funktionen der PowerShell. Insbesondere der Kommandozeileninterpreter ist sehr mächtig, so gibt es bereits die objektbasierte Pipe, eine eigene Skriptsprache und ein Sicherheitsmodel. PowerShell kann sogenannte Namensräume wie das Dateisystem, den Zertifikatsspeicher oder die Registry ansprechen. Cmdlets können ausschließlich in .NET geschrieben werden, Skripte können auf entfernten Computern nur per WMI ausgeführt werden, die verfügbare Konsole ist sehr einfach gehalten.

PowerShell 2.0[Bearbeiten | Quelltext bearbeiten]

Mit der PowerShell 2.0 können wird die Erstellung von neuen Cmdlets drastisch vereinfacht. Cmdlets können erstmals auch als Skripte geschrieben werden. Auch die Hilfe, basierend auf Kommentaren in Cmdlets, wird eingeführt. Cmdlets können als Module zusammen gefasst werden. Außerdem wird die PowerShell ISE eingeführt, eine leistungsfähige Konsole mit eingebautem Skripteditor. Zur Verwaltung von entfernten Computern wird PowerShell Remoting eingeführt. Zusätzlich kann PowerShell nun Jobs erstellen, die im Hintergrund abgearbeitet werden.

PowerShell 3.0[Bearbeiten | Quelltext bearbeiten]

PowerShell 3.0 wird ausgereifter und benutzerfreundlicher. Workflows auf Basis der Windows Workflow Foundation werden eingeführt, womit es mit geringen Mitteln möglich ist, Aufgaben parallel erledigen zu lassen. Erstmals wird CIM und JSON unterstützt. Im System verfügbare Module werden automatisch geladen und stehen dem Administrator somit sofort zur Verfügung.

PowerShell 4.0[Bearbeiten | Quelltext bearbeiten]

Mit PowerShell 4.0 wird Desired State Configuration (DSC) eingeführt, eine deklarativer Sprache zur Konfiguration von Systemen.

PowerShell 5.0[Bearbeiten | Quelltext bearbeiten]

In PowerShell 5.0 wird Desired State Configuration (DSC) deutlich erweitert und verbessert. Außerdem werden Klassen, welche es erlauben Skripte formaler entwickeln zu lassen, und Oneget, eine Paketverwaltung für PowerShell, eingeführt. In der PowerShell ISE können nun auch Skripte Sitzungen auf entfernten Computern geändert werden.

Objekte und die Pipe[Bearbeiten | Quelltext bearbeiten]

Andere Kommandozeileninterpreter wie Cmd.exe, Bash oder DCL sind text-basiert, wohingegen PowerShell mit Objekten arbeitet. Objekte können Eigenschaften (Properties), Methoden (Methods) und Ereignisse (Events) enthalten. Get-Member zeigt den Typ sowie die Eigenschaften und Methoden von Objekten.

Für die Systemverwaltung/Administration bedeutet dies, dass Ergebnisse von Befehlen nicht mehr als Text (unstrukturierte Daten) sondern Objekte (strukturierte Daten) vorliegen.

PowerShell arbeitet dabei mit einer dynamischen Typisierung. Dabei kommt ein erweitertes Typsystem (englisch: extended type system, ETS) zum Einsatz, bei dem .NET-Objekte in der Klasse PSObject gekapselt werden. PSObject stellt hierbei die Basisklasse für PowerShell-Objekte dar. PSObject entspricht damit einer Monade.

In C#:
using System;
using System.Management.Automation;

namespace PowerShell
{
    public class PSObjectExample
    {
        public void Main()
        {
            var time = DateTime.UtcNow;
            var powerTime = new PSObject(time);
        }
     }
}
In PowerShell:
# Aufruf einer statischen Methode mit [ClassName]::Method
# Variable $time ist explizit typisiert
[System.DateTime]$time = [System.DateTime]::UtcNow

# explizites Typecasting nach PSObject
# Variable $powerTime ist implizit typisiert
$powerTime = [System.Management.Automation.PSObject] $time

# Aufruf eines Konstruktors
$powerTime = New-Object System.Management.Automation.PSObject($time)

PowerShell bietet implizite Typkonvertierung. Dabei kommen Typkonverter zum Einsatz, von denen einige vorgegeben sind:

Typ Konvertiert nach Methode
null String gibt String.Empty zurück
null Char gibt '\0' zurück
null Numeric gibt 0 zurück
null Boolean gibt false zurück
null Nullable<T> gibt null zurück
null Objektreferenz gibt null zurück
Klasse Basisklasse Boxing der Klasse auf die Basisklasse
object void gibt AutomationNull.Value zurück
object String gibt value.ToString() zurück
object Boolean gibt das Ergebnis von LanguagePrimitives.IsTrue(value) zurück
object PSObject gibt PSObject.AsPSObject(value) zurück
object XMLDocument ruft die value.ToString()-Methode auf und übergibt das Ergebnis dem XMLDocument Konstruktor
object Nullable<T> das Objekt wird mit (T)value convertiert und als Nullable-Monade zurückgegeben
Array Array Konvertierung der einzelnen Array-Elemente
IDictionary Hashtable gibt new Hashtable(value) zurück
String Char[] gibt value.ToCharArray() zurück
String RegEx gibt new RegEx(value) zurück
String Type Deserialisierung über RunSpaceConfiguration.Assemblies
String Numeric 0 für String.Empty. Versucht den Wert mit Culture.InvariantCulture zu parsen.
Integer System.Enum Liefert den Enum-Wert zurück, der dem Integer zugewiesen ist. throw new PSInvalidCastException() falls das nicht möglich ist.

Die Tatsache, dass PowerShell objektorientiert ist, wirkt sich auch auf die Pipe aus. Die Pipe in text-basierten Kommandozeileninterpretern verbindet die Standardausgabe stdout mit der Standardeingabe stdin des darauffolgenden Befehls. In In PowerShell werden Daten in der Pipe abgelegt und die Pipe muss die Daten an das darauffolgende Cmdlet binden. Ob und wie Eingaben von einer Pipe erlaubt sind, entscheidet jedes Cmdlet für jeden Parameter selbst. Das heißt, die Pipe muss prüfen, ob der Folgebefehl das Binden an einen Parameter erlaubt. Dabei wird zwischen zwei Arten von Bindungen unterschieden: ByValue oder ByPropertyName. Bei ByValue muss der Objekttyp in der Pipe mit dem geforderten Objekttyp übereinstimmen. Bei ByPropertyName muss der Name einer Eigenschaft des Objekts mit dem Namen des Parameter des Folgebefehls übereinstimmen. ByValue wird ByPropertyName gegenüber bevorzugt.

Arbeitet man mit herkömmlichen Konsolenanwendungen in einem PowerShell Host wird der Standardoutput stdout in ein Objekt des Typs String umgewandelt.

Dieses Model ist anfangs komplex, jedoch ergeben sich dadurch in der Praxis auch Vorteile beim Filtern und Verarbeiten von Informationen, wie folgende Beispiele verdeutlichen sollen.

Beispiel 1: Es sollen alle gestoppten Dienste eines entfernten Computers gestartet werden, mit einer Ausgabe welche Dienste gestartet wurden.

# Listet alle Dienste auf einem entfernten Computer auf
# Filtert die zurückgegebene Dienste nach denen, die gestoppt sind
# Startet all diese Dienste und gibt die verarbeiteten Objekte an die Pipeline weiter (-PassThru)
# Gibt die Eigenschaften MachineName, DisplayName und Status der gestarteten Dienste aus

Get-Service -ComputerName Server01 | Where-Object -Property Status -EQ -Value Stopped | Start-Service -PassThru | Select-Object -Property MachineName,DisplayName,Status

Beispiel 2: Auf dem lokalen Computer sollen die 10 Prozesse von Microsoft mit der höchsten Arbeitsspeichernutzung (in Megabyte) in absteigender Reihenfolge in einer CSV-Datei abgespeichert werden.

# Listet alle gestarteten Prozesse auf dem lokalen Computer auf
# Filtert nach Prozessen der Firma Microsoft
# Sortiert nach Arbeitsspeichernutzung (WorkingSet64) absteigend (-Descending)
# Filtert auf die Eigenschaften ProcessName und MemoryUsageMB, wobei MemoryUsageMB ein ''Custom Property'' ist, das zur Laufzeit die bestehende Eigenschaft WorkingSet64 in MB und auf ganze Zahlen gerundet darstellt
# Filtert auf die ersten 10 Objekte
# Das Objekt wird in ein CSV-Format umgewandelt 
# und in einer Datei gespeichert

Get-Process | Where-Object -Property Company -EQ -Value 'Microsoft Corporation' | Sort-Object -Property WorkingSet64 -Descending | Select-Object ProcessName,@{Name='MemoryUsageMB';Expression={[math]::round($PSItem.WorkingSet64/1MB,0)}} | Select-Object -First 10 | ConvertTo-Csv | Out-File -FilePath $env:TEMP\TopProcesses.csv

Skripts[Bearbeiten | Quelltext bearbeiten]

PowerShell Skripte können in einer Skript-Datei zusammengefasst werden. Skript-Dateien enthalten Funktionen mit zugehöriger Beschreibung in einem Kommentarblock, sowie Variablen und Befehle. Skript-Dateien haben die Endung .ps1 und werden mit dem Befehl ., gefolgt vom vollständigen Namen der Datei geladen und verarbeitet.

Beispiel
Dieser Abschnitt bedarf einer Überarbeitung: „a more complex Hello World function“ – absurd und in jeder Hinsicht fehl am Platz
Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung.
<#
.SYNOPSIS
    Hello World Application.

.DESCRIPTION
    This script is a more complex Hello World function that intends to show some of the syntax of PowerShell.
    To use it, write ". ./Write-Hello.ps1" (dot, space, filename) into your PowerShell first, so that the script gets loaded.

.NOTES
    File Name: Write-Hello.ps1

.EXAMPLE
    Write-Hello
    Hello World!

.EXAMPLE
    Write-Hello "World"
    Hello World!

.EXAMPLE
    greet "World"
    Hello World!

.EXAMPLE
    Write-Hello -Name "World"
    Hello World!

.EXAMPLE
    "World" | Write-Hello
    Hello World!

.EXAMPLE
    @("Jack", "Jill") | Write-Hello
    Hello Jack!
    Hello Jill!

.ALIAS
    greet

.LINK
    http://de.wikipedia.org/wiki/PowerShell

.INPUTTYPE
    Takes a name of type [string].

.RETURNVALUE
    Output a greeting of type [string].

.PARAMETER Name
    A list of names of the persons to greet. Greets the world by default.
#>

function Write-Hello
{
    [CmdletBinding()]
    param(
        # get name parameter from the pipeline or as a parameter
        [Parameter(Mandatory = $False, Position = 0, ValueFromPipeline = $True, HelpMessage = "The name to greet.")]
        [string]$Name = "World"
    )

    begin {
        # load assemblies from Global Assembly Cache (deprecated method)
        [void][System.Reflection.Assembly]::LoadWithPartialName("System.Exception")

        # cancel the execution if an error occurs
        $ErrorActionPreference = "Stop"
    }

    # process once for every input that was given
    process {
        try {
            if($Name -eq "Error") {
                throw New-Object System.Exception("The name must not be 'Error'.")
            }
        }
        catch [System.Exception] {
            Write-Error $_
        }

        # process the request
        [string]$Greeting = [string]::Format("Hello {0}!", $Name)

        # outputs a string object to the PowerShell pipeline
        # note: using write-host calls .ToString() method on the returned object
        Write-Output $Greeting
    }

    end {

    }
}

# setting an alias
Set-Alias greet Write-Hello

Beispiele[Bearbeiten | Quelltext bearbeiten]

Gib die Zeichenfolge "Hallo Welt!" auf der Konsole aus:

  Write-Host "Hallo Welt!"


Beende alle Prozesse, deren Namen mit dem Buchstaben „p“ beginnen:

  Get-Process p* | Stop-Process


Suche alle Prozesse, die mehr als 10 MB Hauptspeicher verwenden, und beende sie:

  Get-Process | where { $_.WS -gt 10MB } | Stop-Process


Berechne die Gesamtanzahl der Bytes aller Dateien in einem Verzeichnis:

  Get-ChildItem | Measure-Object -Property Length -Sum


Warte, bis ein bestimmter Prozess beendet wurde:

  $processToWatch = Get-Process notepad
  $processToWatch.WaitForExit()


Ändere eine Zeichenkette von Kleinbuchstaben in Großbuchstaben:

  "hallo welt!".ToUpper()


Füge die Zeichenfolge „ABC“ nach dem ersten Buchstaben des Wortes „string“ ein, um als Ergebnis „sABCtring“ zu erhalten:

  "string".Insert(1, "ABC")


Lade einen bestimmten RSS-Web-Feed herunter und zeige die Überschriften der acht neuesten Einträge:

  $rssUrl = "http://blogs.msdn.com/b/powershell/rss.aspx"
  $blog = [xml](New-Object System.Net.WebClient).DownloadString($rssUrl)
  $blog.rss.channel.item | select title -First 8


Lösche die komplette Festplatte ohne Rückfrage, Äquivalent zu rm -rf / unter Unix:

  Get-PSDrive -p "FileSystem" | % { ls -Recurse $_.Root | rm Force }

Dateiendungen[Bearbeiten | Quelltext bearbeiten]

  • .ps1 – Windows PowerShell Shell-Skript
  • .ps1xml – Windows PowerShell Format- und Typdefinitionen
  • .psc1 – Windows PowerShell Konsolendatei (exportierte Shell-Konfiguration)
  • .psd1 – Windows PowerShell Datendatei
  • .psm1 – Windows PowerShell Moduldatei

Software-Unterstützung[Bearbeiten | Quelltext bearbeiten]

Unterstützt werden unter anderem folgende Systeme:

Software Version Cmdlets Provider Grafische Benutzeroberfläche
Microsoft Exchange Server 2007 Ja (402) Ja Ja
Microsoft Exchange Server 2010 Ja Ja Ja
Microsoft Windows Server 2008 Ja Ja Nein
Microsoft Windows Server 2008 Core Nein Nein Nein
Microsoft Windows Server 2008 R2 Core Ja Nein Nein
Microsoft SQL Server 2008 Ja Ja Nein
SharePoint 2010, 2013 Ja Ja Nein
Microsoft System Center Operations Manager 2007 Ja (74) Ja Nein
Microsoft System Center Virtual Machine Manager 2007 Ja Ja Ja
Microsoft System Center Data Protection Manager 2007 Ja Nein Nein
Microsoft Windows Compute Cluster Server 2007 Ja Ja Nein
Microsoft Transporter Suite for Lotus Domino[31] 08.02.0012 Ja (47) Nein Nein
Microsoft PowerTools for Open XML[32] 1.0 Ja (33) Nein Nein
IBM WebSphere MQ[33] 6.0.2.2 Ja (44) Nein Nein
Quest Management Shell for Active Directory[34] 1.1 Ja (40) Nein Nein
Special Operations Software Specops Command[35] 1.0 Ja Nein Ja
VMware Infrastructure Toolkit[36] 1.0 Update 1 Ja (125) Nein Nein
Internet Information Services[37] 7.0 Ja (54) Ja Nein
Microsoft Windows 7 Troubleshooting Center 6.1 Ja Nein Ja
Microsoft Deployment Toolkit 2010 Ja Nein Nein
LOGINventory 5.x Ja Ja Ja
Citrix XenApp seit v5.x Ja Ja Ja
Citrix XenDesktop seit v5.x Ja Ja Ja

Literatur[Bearbeiten | Quelltext bearbeiten]

Deutsch

  • Ulrich Cuber: Windows PowerShell. Mitp-Verlag 2007, ISBN 978-3-8266-1673-0.
  • Lee Holmes, Rolf Masuch: Windows PowerShell 3.0 kurz & gut. 3. Auflage. O’Reilly, 2013, ISBN 978-3-95561-055-5.
  • Peter Monadjemi: Windows PowerShell – Crashkurs. Microsoft Press Deutschland 2007, ISBN 978-3-86645-617-4.
  • Andy Oakley: Schnelleinstieg in die Windows PowerShell. O’Reilly Verlag 2007, ISBN 978-3-89721-487-3.
  • Bruce Payette: Windows PowerShell im Einsatz. Hanser Fachbuchverlag 2007, ISBN 978-3-446-41239-2.
  • Holger Schwichtenberg: Windows PowerShell. Addison-Wesley 2007, ISBN 978-3-8273-2533-4.
  • Holger Schwichtenberg: Windows Scripting. Automatisierte Systemadministration mit dem Windows Script Host und der Windows PowerShell. Addison-Wesley 2007, ISBN 978-3-8273-2423-8.
  • Helma Spona: Windows PowerShell. Sprachgrundlagen, Dateisystem, Datenbankzugriffe, WMI-Steuerung. Galileo Press 2007, ISBN 978-3-89842-880-4.
  • Tobias Weltner: Scripting mit Windows PowerShell – Einsteiger-Workshop. Microsoft Press Deutschland 2007, ISBN 978-3-86645-620-4.
  • Tobias Weltner: PowerShell Scripting für Administratoren. Microsoft Press Deutschland 2008, ISBN 978-3-86645-635-8.

Englisch

  • Jerry Lee Ford Jr.: Microsoft Windows Powershell Programming for the Absolute Beginner. Course Technology Ptr 2007, ISBN 1-59863-354-6.
  • Lee Holmes: Windows PowerShell Quick Reference. O’Reilly 2006, ISBN 0-596-52813-2.
  • Don Jones: An Introduction to Microsoft® PowerShell™. Realtimepublishers.com 2006.
  • Don Jones, Jeffery Hicks: Windows PowerShell™: TFM®. SAPIEN Press 2006, ISBN 0-9776597-1-2.
  • Tyson Kopczynski: Microsoft Powershell Unleashed. Sams Publishing 2007, ISBN 0-672-32953-0.
  • Andy Oakley: Monad – Introducing the MSH Command Shell and Language. O’Reilly 2006, ISBN 0-596-10009-4.
  • Bruce Payette: Windows PowerShell in Action. Manning Publications, ISBN 1-932394-90-7.
  • Andrew Watt: Professional Windows PowerShell. Wrox Press 2007, ISBN 0-471-94693-1.
  • Ed Wilson: Microsoft® Windows PowerShell™ Step By Step. Microsoft Press 2007, ISBN 0-7356-2395-3.
  • Steve Seguis: Windows PowerShell 2 for Dummies, ISBN 978-0-470-37198-5
  • Arul Kumaravel, Jon White, Michael Naixin Li, Scott Happell, Guohui Xie, Krishna C. Vutukuri: Professional Windows PowerShell Programming: Snapins, Cmdlets, Hosts and Providers (= Wrox Professional Series). 1. Auflage. John Wiley & Sons, 2008, ISBN 978-0-470-17393-0 (Standardwerk zur PowerShell-Entwicklung mit C#).

Weblinks[Bearbeiten | Quelltext bearbeiten]

Schnellreferenzen

Einführung

Blogs

Cmdlets und Module

Portierungen

  • Pash. In: Github. Abgerufen am 6. August 2013 (englisch, Mono-Portierung von PowerShell).

BDD und Unit Testing Frameworks

  • Pester. In: Github. Abgerufen am 16. April 2014 (englisch).
  • PS Unit. In: CodePlex. Abgerufen am 16. April 2014 (englisch).
  • PsTest. Abgerufen am 16. April 2014 (englisch).

Automation, Delegation & Management mit PowerShell Skripten

Sonstiges

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. Releases. In: PowerShell. GitHub, abgerufen am 30. August 2016.
  2. a b PowerShell Lizenz auf Github
  3. PowerShell Readme-Datei auf Github
  4. PowerShell auf Github
  5. a b blogs.msdn.microsoft.com: PowerShell on Linux and Open Source
  6. msdn.microsoft.com: Windows Management Framework (WMF) 5.0 RTM – Anmerkungen zu dieser Version – Übersicht
  7. technet.microsoft.com: PowerShell unter Nano Server
  8. PowerShell.org auf YouTube: Snover Monad Manifesto Revisited
  9. jsnover.com: Monad Manifesto (PDF)
  10. blogs.msdn.microsoft.com: Windows PowerShell (Monad) Has Arrived
  11. blogs.msdn.microsoft.com: It’s a Wrap! Windows PowerShell 1.0 Released!
  12. YouTube: Jeffrey Snover 2015 auf dem DevOps Enterprise Summit über The Cultural Battle To Remove Windows from Windows Server
  13. blogs.msdn.microsoft.com: PowerShell To Be Added to Common Engineering Criteria
  14. blogs.msdn.microsoft.com: Windows PowerShell 2.0 RTM
  15. blogs.msdn.microsoft.com: Windows PowerShell 2.0 on Windows Update
  16. azure.microsoft.com: PowerShell is open sourced and is available on Linux
  17. Windows PowerShell. In: Microsoft TechNet. Microsoft, archiviert vom Original am 21. Dezember 2007, abgerufen am 3. September 2016.
  18. msdn.microsoft.com: Cmdlet Overview
  19. Approved Verbs for Windows PowerShell Commands. In: Windows Dev Center. Microsoft, abgerufen am 3. August 2013 (englisch).
  20. a b c d e f g h i j k l m n o p q r s t u v w Tomoaki Yoshizawa: PowerShell 1.0 Cmdlets. In: Microsoft TechNet. Abgerufen am 3. September 2016.
  21. Windows PowerShell Core Cmdlets. Windows PowerShell 3.0. In: Microsoft Developer Network. Microsoft, abgerufen am 3. September 2016.
  22. a b c Overview of Cmdlets Available in Windows PowerShell. In: Microsoft TechNet. Microsoft, abgerufen am 3. September 2016.
  23. a b Alphabetical List of Tools in the Windows NT 4.0 Resource Kit Supplement 4. Microsoft, abgerufen am 10. Februar 2016.
  24. TList. Microsoft, abgerufen am 10. Februar 2016.
  25. Tasklist. Microsoft, abgerufen am 10. Februar 2016.
  26. Kill Tool. Microsoft, abgerufen am 10. Februar 2016.
  27. Taskkill. Microsoft, abgerufen am 10. Februar 2016.
  28. Net TCP/IP Cmdlets in Windows PowerShell. Windows Server 2012 and Windows 8. In: Microsoft Developer Network. Microsoft, abgerufen am 3. September 2016.
  29. msdn.microsoft.com: Understanding a Windows PowerShell Module
  30. msdn.microsoft.com PowerShell Referenz: about_PSSnapins
  31. Microsoft Transporter Suite for Lotus Domino. Abgerufen am 18. Februar 2008.
  32. PowerTools for Open XML. Abgerufen am 20. Juni 2008.
  33. MO74: WebSphere MQ – Windows Powershell Library. Abgerufen am 18. Februar 2008.
  34. PowerShell Commands for Active Directory by Quest Software. Abgerufen am 2. Juli 2008.
  35. PowerShell Remoting through Group Policy. Abgerufen am 18. Februar 2008.
  36. VMware Infrastructure Toolkit for Windows. Abgerufen am 26. November 2008.
  37. Windows PowerShell: IIS7 PowerShell Provider Tech Preview 2. Abgerufen am 3. Juli 2008.