Zum Inhalt springen

PowerShell: Unterschied zwischen den Versionen

Aus Foxwiki
K Textersetzung - „–“ durch „-“
 
(29 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
'''PowerShell'''
'''PowerShell''' - [[Plattformunabhängigkeit|plattformübergreifendes]] [[Framework]] von [[Microsoft]] zur Automatisierung, Konfiguration und Verwaltung von Systemen, das einen [[Kommandozeileninterpreter]] inklusive [[Skriptsprache]] bietet
<!--
<!--
[[Datei:Windowspowershell unter Windows 8.png|300px|Windows PowerShell]]
[[Datei:Windowspowershell unter Windows 8.png|300px|Windows PowerShell]]
Zeile 5: Zeile 5:


== Beschreibung ==
== Beschreibung ==
'''PowerShell''' (auch '''Windows PowerShell''' und '''PowerShell Core''') ist ein [[Plattformunabhängigkeit|plattformübergreifendes]] [[Framework]] von [[Microsoft]] zur Automatisierung, Konfiguration und Verwaltung von Systemen, das einen [[Kommandozeileninterpreter]] inklusive [[Skriptsprache]] bietet.<ref name="PowerShellReadme">[https://github.com/PowerShell/PowerShell/blob/master/README.md PowerShell Readme-Datei auf Github]</ref>
''Windows PowerShell'' basiert auf der [[Common Language Runtime]] (CLR) des [[.NET Framework]]s und wird mit [[Microsoft Windows|Windows]] als Teil des [[Windows Management Framework]]s (WMF) unter einer [[Proprietäre Software|proprietären Lizenz]] ausgeliefert
 
* Seit 2016 gibt es Windows PowerShell auch als ''Core Edition'', welche wie [[PowerShell#PowerShell Core 6|PowerShell Core]] auf [[.NET Core]] basiert und als Teil von ''Windows Nano Server'' und [[Windows IoT]] ausgeliefert wird
''Windows PowerShell'' basiert auf der [[Common Language Runtime]] (CLR) des [[.NET Framework]]s und wird mit [[Microsoft Windows|Windows]] als Teil des [[Windows Management Framework]]s (WMF) unter einer [[Proprietäre Software|proprietären Lizenz]] ausgeliefert.<ref name="BlogsMsdnPowerShellOpenSource">[https://blogs.msdn.microsoft.com/powershell/2016/08/18/powershell-on-linux-and-open-source-2/ blogs.msdn.microsoft.com: PowerShell on Linux and Open Source]</ref><ref name="MsdnWMF5ReleaseNotes">[https://msdn.microsoft.com/powershell/wmf/5.0/releasenotes msdn.microsoft.com: Windows Management Framework (WMF) 5.0 RTM – Anmerkungen zu dieser Version – Übersicht]</ref>
* Seit [[PowerShell#PowerShell Core 6|Version 6]] basiert PowerShell auf der Core Common Language Runtime (CoreCLR) und ist als plattformübergreifendes [[Open Source|Open-Source]]-Projekt
Seit 2016 gibt es Windows PowerShell auch als ''Core Edition'', welche wie [[PowerShell#PowerShell Core 6|PowerShell Core]] auf [[.NET Core]] basiert und als Teil von ''Windows Nano Server'' und [[Windows IoT]] ausgeliefert wird.<ref name="TechnetPowerShellNanoServer">[https://technet.microsoft.com/de-de/windows-server-docs/get-started/powershell-on-nano-server technet.microsoft.com: PowerShell unter Nano Server]</ref>
 
Seit [[PowerShell#PowerShell Core 6|Version 6]] basiert PowerShell auf der Core Common Language Runtime (CoreCLR) und ist als plattformübergreifendes [[Open Source|Open-Source]]-Projekt<ref name="GithubPowerShell">[https://github.com/PowerShell/PowerShell PowerShell auf Github]</ref> unter der [[MIT-Lizenz]]<ref name="PowerShellLicense" /> für [[Linux]], [[macOS]] und [[Windows]] verfügbar.<ref name="BlogsMsdnPowerShellOpenSource" />
 
== Installation ==
<syntaxhighlight lang="bash" highlight="1" line>
</syntaxhighlight>
 
== Aufruf ==
<syntaxhighlight lang="bash" highlight="1" line>
</syntaxhighlight>
 
=== Optionen ===
{| class="wikitable sortable options gnu"
|-
! Unix !! GNU !! Parameter !! Beschreibung
|-
| || || ||
|-
|}
 
=== Parameter ===
 
=== Umgebungsvariablen ===
 
=== Exit-Status ===
{| class="wikitable options col1center"
|-
! Wert !! Beschreibung
|-
| 0 || Erfolg
|-
| >0  || Fehler
|}
 
== Anwendung ==
<syntaxhighlight lang="bash" highlight="1" line>
</syntaxhighlight>
 
=== Problembehebung ===
 
== Konfiguration ==
 
=== Dateien ===
{| class="wikitable options"
|-
! Datei !! Beschreibung
|-
| ||
|-
| ||
|}
<noinclude>
 
== Anhang ==
=== Siehe auch ===
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}
 
=== Dokumentation ===
 
; Man-Page
# [https://manpages.debian.org/testing/procps/pgrep.1.de.html prep(1)]
 
; Info-Pages
 
=== Links ===
==== Projekt ====
 
==== Weblinks ====
# https://de.wikipedia.org/wiki/PowerShell
 
{{DEFAULTSORT:new}}
{{DISPLAYTITLE:new}}
 
[[Kategorie:Shell]]
[[Kategorie:.NET]]
[[Kategorie:Windows-Betriebssystemkomponente]]
[[Kategorie:Skriptsprache]]
 
</noinclude>
 
= TMP =
| Beschreibung    = Screenshot der powershell.exe 5.0 innerhalb <code>conhost.exe</code> unter [[Microsoft Windows 8|Windows 8.1]]
| Hersteller      = [[Microsoft]]
| AktuelleVersion = <!-- aus Wikidata -->
| AktuelleVersionFreigabeDatum = <!-- aus Wikidata -->
| AktuelleVorabVersion =
| AktuelleVorabVersionFreigabeDatum =
| Betriebssystem  = [[Microsoft Windows]], ab Version 6 auch [[Linux]] und [[macOS]]
| Kategorie      = [[Kommandozeileninterpreter]]
| Lizenz          = Proprietär, [[MIT-Lizenz]]<ref name="PowerShellLicense">[https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt PowerShell Lizenz auf Github]</ref>
| Deutsch        = ja
| Website        = [https://docs.microsoft.com/de-de/powershell/ PowerShell]
 
'''PowerShell''' (auch '''Windows PowerShell''' und '''PowerShell Core''') ist ein [[Plattformunabhängigkeit|plattformübergreifendes]] [[Framework]] von [[Microsoft]] zur Automatisierung, Konfiguration und Verwaltung von Systemen, das einen [[Kommandozeileninterpreter]] inklusive [[Skriptsprache]] bietet.<ref name="PowerShellReadme">[https://github.com/PowerShell/PowerShell/blob/master/README.md PowerShell Readme-Datei auf Github]</ref>
 
''Windows PowerShell'' basiert auf der [[Common Language Runtime]] (CLR) des [[.NET Framework]]s und wird mit [[Microsoft Windows|Windows]] als Teil des [[Windows Management Framework]]s (WMF) unter einer [[Proprietäre Software|proprietären Lizenz]] ausgeliefert.<ref name="BlogsMsdnPowerShellOpenSource">[https://blogs.msdn.microsoft.com/powershell/2016/08/18/powershell-on-linux-and-open-source-2/ blogs.msdn.microsoft.com: PowerShell on Linux and Open Source]</ref><ref name="MsdnWMF5ReleaseNotes">[https://msdn.microsoft.com/powershell/wmf/5.0/releasenotes msdn.microsoft.com: Windows Management Framework (WMF) 5.0 RTM – Anmerkungen zu dieser Version – Übersicht]</ref>
Seit 2016 gibt es Windows PowerShell auch als ''Core Edition'', welche wie [[PowerShell#PowerShell Core 6|PowerShell Core]] auf [[.NET Core]] basiert und als Teil von ''Windows Nano Server'' und [[Windows IoT]] ausgeliefert wird.<ref name="TechnetPowerShellNanoServer">[https://technet.microsoft.com/de-de/windows-server-docs/get-started/powershell-on-nano-server technet.microsoft.com: PowerShell unter Nano Server]</ref>
 
Seit [[PowerShell#PowerShell Core 6|Version 6]] basiert PowerShell auf der Core Common Language Runtime (CoreCLR) und ist als plattformübergreifendes [[Open Source|Open-Source]]-Projekt<ref name="GithubPowerShell">[https://github.com/PowerShell/PowerShell PowerShell auf Github]</ref> unter der [[MIT-Lizenz]]<ref name="PowerShellLicense" /> für [[Linux]], [[macOS]] und [[Windows]] verfügbar.<ref name="BlogsMsdnPowerShellOpenSource" />


; Software-Unterstützung
Zahlreiche Systeme wie [[Microsoft Exchange Server]], [[Microsoft SQL Server]] oder [[Citrix XenDesktop]] unterstützen die Powershell.


== Aufbau ==
== Aufbau ==
PowerShell wurde speziell für die Systemverwaltung und -automatisierung entworfen.<ref>{{Internetquelle |url=http://technet.microsoft.com/en-us/library/bb978526.aspx |titel=Windows PowerShell |werk=[[Microsoft TechNet]] |hrsg=Microsoft |abruf=2016-09-03 |archiv-url=https://web.archive.org/web/20071221131912/http://technet.microsoft.com/en-us/library/bb978526.aspx |archiv-datum=2007-12-21 |offline=1}}</ref>
PowerShell wurde für die Systemverwaltung und -automatisierung entworfen


Sie verbindet die aus [[Unix-Shell]]s bekannte Philosophie von [[Pipes und Filter]]n mit dem [[Paradigma]] der [[Objektorientierte Programmierung|objektorientierten Programmierung]]. Der Benutzer kann wie bisher einfache Befehle an einer [[Kommandozeile]] ausführen und miteinander verknüpfen oder aber auch komplexe [[Skriptsprache|Skript-Programme]] mit der eigens dafür entwickelten ''PowerShell Scripting Language'' schreiben.
Sie verbindet die aus [[Unix-Shell]]s bekannte Philosophie von [[Pipes und Filter]]n mit dem [[Paradigma]] der [[Objektorientierte Programmierung|objektorientierten Programmierung]]
* Der Benutzer kann wie bisher einfache Befehle an einer [[Kommandozeile]] ausführen und miteinander verknüpfen oder aber auch komplexe [[Skriptsprache|Skript-Programme]] mit der eigens dafür entwickelten ''PowerShell Scripting Language'' schreiben


Die PowerShell erlaubt Zugriff auf [[Windows Management Instrumentation|WMI]]-Klassen, [[Component Object Model|COM]]-Objekte sowie auf das gesamte [[.NET Framework]].
Die PowerShell erlaubt Zugriff auf [[Windows Management Instrumentation|WMI]]-Klassen, [[Component Object Model|COM]]-Objekte sowie auf das gesamte [[.NET Framework]]


=== PowerShell Engine ===
=== Engine ===
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|.NET]]-[[Klasse (Objektorientierung)|Klassen]], die in einer [[Dynamic Link Library|DLL]] (<code>System.Management.Automation.dll</code>) gespeichert sind.
; PowerShell Engine
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|.NET]]-[[Klasse (Objektorientierung)|Klassen]], die in einer [[Dynamic Link Library|DLL]] (<code>System.Management.Automation.dll</code>) gespeichert sind


=== PowerShell Host ===
=== Host ===
Der ''PowerShell Host'' ist die [[Benutzerschnittstelle]] zur PowerShell Engine. In Windows steht standardmäßig die ''Windows PowerShell'' (auch ''Konsole'') (<code>powershell.exe</code>, bereitgestellt durch <code>conhost.exe</code>) und ''Windows PowerShell ISE'' (''Integrated Scripting Environment'', kurz ''ISE'') (<code>powershell_ise.exe</code>) 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 <code>ipconfig.exe</code>. Jedoch erlaubt die ISE keine Interaktion, wie zum Beispiel bei <code>nslookup.exe</code>. Die ISE kann durch [[Plug-in|Add-ons]] erweitert werden; eine bekannte Erweiterung ist ''ISESteroids''.
; PowerShell Host
Auch Verwaltungskonsolen, wie etwa die Exchange Management Console (EMC) seit [[Microsoft Exchange Server|Exchange Server 2007]], sind ein Host. Darüber hinaus gibt es auf dem Markt weitere Hosts, wie ''PowerShell Plus'' von Idera.
Der ''PowerShell Host'' ist die [[Benutzerschnittstelle]] zur PowerShell Engine
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.
* In Windows steht standardmäßig die ''Windows PowerShell'' (auch ''Konsole'') (<code>powershell.exe</code>, bereitgestellt durch <code>conhost.exe</code>) und ''Windows PowerShell ISE'' (''Integrated Scripting Environment'', kurz ''ISE'') (<code>powershell_ise.exe</code>) 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 <code>ipconfig.exe</code>
* Jedoch erlaubt die ISE keine Interaktion, wie zum Beispiel bei <code>nslookup.exe</code>
* Die ISE kann durch [[Plug-in|Add-ons]] erweitert werden; eine bekannte Erweiterung ist ''ISESteroids''
Auch Verwaltungskonsolen, wie etwa die Exchange Management Console (EMC) seit [[Microsoft Exchange Server|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 (PSL) ===
=== Scripting Language===
Die ''PowerShell Scripting Language (PSL)'' ist die [[Skriptsprache|Sprache]] um Skripte für die PowerShell Engine zu entwickeln. Ab Version 2.0 kann die Skriptsprache auch verwendet werden, um eigene Cmdlets zu erstellen.
; PowerShell Scripting Language (PSL)
Die ''PowerShell Scripting Language (PSL)'' ist die [[Skriptsprache|Sprache]] um Skripte für die PowerShell Engine zu entwickeln
* Ab Version 2.0 kann die Skriptsprache auch verwendet werden, um eigene Cmdlets zu erstellen


Die PowerShell-Sprache basiert auf dem [[Portable Operating System Interface|IEEE 1003.2 POSIX Shell Standard]] und die Syntax ist an der Programmiersprache [[C-Sharp|C#]] angelehnt.<ref>Bruce Payette, Richard Siddaway: ''Windows PowerShell in Action.'' 3. Ausgabe. Manning, Shelter Island 2018, ISBN 978-1-63343-029-7, [https://livebook.manning.com/book/windows-powershell-in-action-third-edition/chapter-1/191 S.&nbsp;17–18].</ref> Mit Version 5 wurde die Skriptsprache um [[Klasse (Objektorientierung)|Klassen]] erweitert.<ref>Bruce Payette, Richard Siddaway: ''Windows PowerShell in Action.'' Shelter Island 2018, S.&nbsp;762.</ref>
Die PowerShell-Sprache basiert auf dem [[Portable Operating System Interface|IEEE 1003.2 POSIX Shell Standard]] und die Syntax ist an der Programmiersprache [[C-Sharp|C#]] angelehnt
Mit Version 5 wurde die Skriptsprache um [[Klasse (Objektorientierung)|Klassen]] erweitert


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


=== Cmdlets ===
=== Cmdlets ===
''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 [[Standalone]]-Anwendungen, das heißt, sie können nicht ohne die PowerShell ausgeführt werden. Cmdlets können [[.NET Framework|.NET]]-[[Klasse (Objektorientierung)|Klassen]] oder PowerShell-Skripte sein und mit wenigen Zeilen [[Programmcode]] geschrieben werden. Cmdlets [[Parser|parsen]] Eingaben in der Regel nicht selber, stellen Fehler nicht selbst dar und geben Ergebnisse unformatiert als Objekt wieder.<ref name="CmdletOverview">[https://msdn.microsoft.com/en-us/library/ms714395(v=vs.85).aspx msdn.microsoft.com: Cmdlet Overview]</ref> Die PowerShell-Engine bzw. Standard-Cmdlets nehmen Cmdlet-Entwicklern Arbeit von Standardaufgaben ab und vereinfachen und beschleunigen die Entwicklung. Gleichzeitig wird die Nutzbarkeit und Lesbarkeit von Skripten und Befehlen durch sehr strikte und ausführliche Namenskonventionen gewährleistet.
''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 [[Standalone]]-Anwendungen, das heißt, sie können nicht ohne die PowerShell ausgeführt werden
* Cmdlets können [[.NET Framework|.NET]]-[[Klasse (Objektorientierung)|Klassen]] oder PowerShell-Skripte sein und mit wenigen Zeilen [[Programmcode]] geschrieben werden
* Cmdlets [[Parser|parsen]] Eingaben in der Regel nicht selber, stellen Fehler nicht selbst dar und geben Ergebnisse unformatiert als Objekt wieder
* Die PowerShell-Engine bzw.&nbsp;Standard-Cmdlets nehmen Cmdlet-Entwicklern Arbeit von Standardaufgaben ab und vereinfachen und beschleunigen die Entwicklung
* Gleichzeitig wird die Nutzbarkeit und Lesbarkeit von Skripten und Befehlen durch sehr strikte und ausführliche Namenskonventionen gewährleistet


Die Anzahl der vorinstallierten Cmdlets steigt mit jeder Version. Sie liegt in der Version 5.1 der Legacy-PowerShell bei 489 Cmdlets und 766 mitgelieferten Funktionen und in der Core-Version 6.1 bei 287 Cmdlets und 145 mitgelieferten Funktionen im Kernpaket und 1900 Cmdlets mit zusätzlichen Modulen.<ref>{{Internetquelle |url=https://docs.microsoft.com/de-de/powershell/scripting/whats-new/what-s-new-in-windows-powershell-50 |titel=Neuerungen in Windows PowerShell 5.0 |abruf=2019-01-30}}</ref><ref name=":0" />
Die Anzahl der vorinstallierten Cmdlets steigt mit jeder Version
* Sie liegt in der Version 5.1 der Legacy-PowerShell bei 489 Cmdlets und 766 mitgelieferten Funktionen und in der Core-Version 6.1 bei 287 Cmdlets und 145 mitgelieferten Funktionen im Kernpaket und 1900 Cmdlets mit zusätzlichen Modulen


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


Microsoft hat eine Liste mit erlaubten Verben veröffentlicht. Die Einhaltung der Verben wird nicht technisch erzwungen. Sie wird jedoch empfohlen, um die Bedienung zu vereinheitlichen.<ref>{{Internetquelle |url=http://msdn.microsoft.com/en-us/library/windows/desktop/ms714428(v=vs.85).aspx |titel=Approved Verbs for Windows PowerShell Commands |werk=Windows Dev Center |hrsg=Microsoft |abruf=2013-08-03 |sprache=en}}</ref> Die Liste der freigegebenen Verben kann mit <syntaxhighlight lang="powershell" inline>Get-Verb</syntaxhighlight> abgerufen werden.
Microsoft hat eine Liste mit erlaubten Verben veröffentlicht
* Die Einhaltung der Verben wird nicht technisch erzwungen
* Sie wird jedoch empfohlen, um die Bedienung zu vereinheitlichen
* Die Liste der freigegebenen Verben kann mit <syntaxhighlight lang="powershell" inline copy>Get-Verb</syntaxhighlight> abgerufen werden


Für Cmdlets können [[Alias (Unix)|Aliase]] hinterlegt werden, etwa um Kompatibilität zu alten Skripten herzustellen, das Umsteigen von anderen Systemen zu erleichtern oder einfach Befehle mit weniger Buchstaben ausführen zu können. Einige dieser Aliase werden bereits durch Module vordefiniert. So wird beispielsweise das Cmdlet <code>Set-Location</code> verwendet, um das aktuelle Verzeichnis des Hosts zu definieren, es sind jedoch auch die Aliase <code>sl</code>, <code>cd</code> und <code>chdir</code> verwendbar.
Für Cmdlets können [[Alias (Unix)|Aliase]] hinterlegt werden, etwa um Kompatibilität zu alten Skripten herzustellen, das Umsteigen von anderen Systemen zu erleichtern oder einfach Befehle mit weniger Buchstaben ausführen zu können
* Einige dieser Aliase werden bereits durch Module vordefiniert
* So wird beispielsweise das Cmdlet <code>Set-Location</code> verwendet, um das aktuelle Verzeichnis des Hosts zu definieren, es sind jedoch auch die Aliase <code>sl</code>, <code>cd</code> und <code>chdir</code> verwendbar


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


{| class="wikitable sortable"
{| class="wikitable sortable options big"
|-
|-
!PowerShell<br />Cmdlet
!PowerShell<br />Cmdlet
Zeile 155: Zeile 87:
|-
|-
|Get-Help
|Get-Help
|1.0<ref name="Yoshizawa" />
|1.0
|help, man
|help, man
|help
|help
Zeile 162: Zeile 94:
|-
|-
|Get-Command
|Get-Command
|1.0<ref name="Yoshizawa" />
|1.0
|gcm
|gcm
|
|
|
|
|Listet alle im derzeitigen Kontext verfügbaren Befehle und Aliase auf.
|Listet alle im derzeitigen Kontext verfügbaren Befehle und Aliase auf
|-
|-
|Get-Alias
|Get-Alias
|1.0<ref name="Yoshizawa" />
|1.0
|gal
|gal
|
|
|alias
|alias
|Listet Aliase für Befehle auf.
|Listet Aliase für Befehle auf
|-
|-
|Get-Location
|Get-Location
|1.0<ref name="Yoshizawa" />
|1.0
|gl, pwd
|gl, pwd
|cd
|cd
Zeile 183: Zeile 115:
|-
|-
|Set-Location
|Set-Location
|1.0<ref name="Yoshizawa" />
|1.0
|sl, cd, chdir
|sl, cd, chdir
|cd, chdir
|cd, chdir
Zeile 190: Zeile 122:
|-
|-
|Clear-Host
|Clear-Host
|3.0<ref>{{Internetquelle |url=https://technet.microsoft.com/en-us/library/hh849695%28v=wps.620%29.aspx |titel=Windows PowerShell Core Cmdlets |titelerg=Windows PowerShell 3.0 |werk=Microsoft Developer Network |hrsg=Microsoft |abruf=2016-09-03}}</ref>
|3.0
|cls, clear
|cls, clear
|cls
|cls
Zeile 197: Zeile 129:
|-
|-
|Copy-Item
|Copy-Item
|1.0<ref name="Yoshizawa" />
|1.0
|cpi, copy, cp
|cpi, copy, cp
|copy
|copy
Zeile 204: Zeile 136:
|-
|-
|Remove-Item
|Remove-Item
|1.0<ref name="Yoshizawa" />
|1.0
|ri, del, erase, rmdir, rd, rm
|ri, del, erase, rmdir, rd, rm
|del, rmdir, rd
|del, rmdir, rd
Zeile 211: Zeile 143:
|-
|-
|Rename-Item
|Rename-Item
|1.0<ref name="Yoshizawa" />
|1.0
|rni, ren
|rni, ren
|ren
|ren
Zeile 218: Zeile 150:
|-
|-
|Move-Item
|Move-Item
|1.0<ref name="Yoshizawa" />
|1.0
|mi, move, mv
|mi, move, mv
|move
|move
Zeile 225: Zeile 157:
|-
|-
|Get-ChildItem
|Get-ChildItem
|1.0<ref name="Yoshizawa" />
|1.0
|gci, dir, ls
|gci, dir, ls
|dir
|dir
Zeile 232: Zeile 164:
|-
|-
|Write-Host
|Write-Host
|1.0<ref name="Yoshizawa" />
|1.0
|echo, write
|echo, write
|[[Echo (Informatik)|echo]]
|[[Echo (Informatik)|echo]]
|echo
|echo
|Ausgabe von Zeichenketten, Variablen etc. in der Konsole
|Ausgabe von Zeichenketten, Variablen etc
* in der Konsole
|-
|-
|Pop-Location
|Pop-Location
|1.0<ref name="Yoshizawa" />
|1.0
|popd
|popd
|popd
|popd
Zeile 246: Zeile 179:
|-
|-
|Push-Location
|Push-Location
|1.0<ref name="Yoshizawa" />
|1.0
|pushd
|pushd
|pushd
|pushd
Zeile 253: Zeile 186:
|-
|-
|Set-Variable
|Set-Variable
|1.0<ref name="Yoshizawa" />
|1.0
|sv, set
|sv, set
|set
|set
Zeile 260: Zeile 193:
|-
|-
|Start-Process
|Start-Process
|2.0<ref name="Stanek">{{Internetquelle |url=https://technet.microsoft.com/en-us/magazine/ff714569 |titel=Overview of Cmdlets Available in Windows PowerShell |werk=Microsoft TechNet |hrsg=Microsoft |abruf=2016-09-03}}</ref>
|2.0
|saps
|saps
|start
|start
Zeile 267: Zeile 200:
|-
|-
|Get-Content
|Get-Content
|1.0<ref name="Yoshizawa">{{Internetquelle |autor=Tomoaki Yoshizawa |url=https://social.technet.microsoft.com/wiki/contents/articles/13769.powershell-1-0-cmdlets.aspx |titel=PowerShell 1.0 Cmdlets |werk=Microsoft TechNet |abruf=2016-09-03}}</ref>
|1.0
|gc, type, cat
|gc, type, cat
|type
|type
Zeile 274: Zeile 207:
|-
|-
|Select-String
|Select-String
|1.0<ref name="Yoshizawa" />
|1.0
|sls
|sls
|find, findstr
|find, findstr
Zeile 281: Zeile 214:
|-
|-
|Get-Process
|Get-Process
|1.0<ref name="Yoshizawa" />
|1.0
|gps, ps
|gps, ps
|tlist,<ref name="NT4" /><ref name="tlist" /> tasklist<ref name="tasklist" />
|tlist,
|[[Ps (Unix)|ps]]
|[[Ps (Unix)|ps]]
|Liste aller momentan laufenden Prozesse
|Liste aller momentan laufenden Prozesse
|-
|-
|Stop-Process
|Stop-Process
|1.0<ref name="Yoshizawa" />
|1.0
|spps, kill
|spps, kill
|kill,<ref name="NT4" /><ref name="kill" /> taskkill<ref name="taskkill" />
|kill,
|[[Kill (Unix)|kill]]
|[[Kill (Unix)|kill]]
|Beenden eines laufenden Prozesses
|Beenden eines laufenden Prozesses
|-
|-
|Stop-Computer
|Stop-Computer
|2.0<ref name="Stanek" />
|2.0
|
|
|shutdown
|shutdown
Zeile 302: Zeile 235:
|-
|-
|Restart-Computer
|Restart-Computer
|2.0<ref name="Stanek" />
|2.0
|
|
|shutdown -r
|shutdown -r
Zeile 309: Zeile 242:
|-
|-
|Tee-Object
|Tee-Object
|1.0<ref name="Yoshizawa" />
|1.0
|tee
|tee
|
|
Zeile 316: Zeile 249:
|-
|-
|Get-NetIPAddress
|Get-NetIPAddress
|3.0<ref>{{Internetquelle |url=https://technet.microsoft.com/de-de/library/hh826123%28v=wps.620%29.aspx |titel=Net TCP/IP Cmdlets in Windows PowerShell |titelerg=Windows Server 2012 and Windows 8 |werk=Microsoft Developer Network |hrsg=Microsoft |abruf=2016-09-03}}</ref>
|3.0
|gip
|gip
|ipconfig
|ipconfig
Zeile 323: Zeile 256:
|-
|-
|Get-Acl
|Get-Acl
|1.0<ref name="Yoshizawa" />
|1.0
|
|
|
|
|acl
|acl
|Listet die Zugriffsberechtigungen eines Ordners oder Dokuments auf.
|Listet die Zugriffsberechtigungen eines Ordners oder Dokuments auf
|-
|-
|Get-Member
|Get-Member
|1.0<ref name="Yoshizawa" />
|1.0
|gm
|gm
|
|
|
|
|Listet die Mitglieder (Member-Variablen) eines Objektes auf.
|Listet die Mitglieder (Member-Variablen) eines Objektes auf
|-
|-
|Get-PSSnapin
|Get-PSSnapin
|1.0<ref name="Yoshizawa" />
|1.0
|gsnp
|gsnp
|
|
|
|
|Listet die aktiven PowerShell-Erweiterungen auf.
|Listet die aktiven PowerShell-Erweiterungen auf
|-
|-
|Export-Console
|Export-Console
|1.0<ref name="Yoshizawa" />
|1.0
|
|
|
|
|export
|export
|Exportiert die aktive Konfiguration der Konsole in eine Datei.<br />Eine neue PowerShell-Instanz kann diese Konfiguration über den Parameter <code>-psconsolefile &lt;String&gt;</code> beim Start laden.
|Exportiert die aktive Konfiguration der Konsole in eine Datei.<br />Eine neue PowerShell-Instanz kann diese Konfiguration über den Parameter <code>-psconsolefile &lt;String&gt;</code> beim Start laden
|}
|}


Parameter werden nach dem Cmdlet mit <code>-Parametername [Wert]</code> angegeben. Ein Parameter kann unterschiedliche Eigenschaften besitzen, so kann er beispielsweise einen Standardwert haben, erforderlich oder positionsbezogen sein oder Werte aus der [[Pipe (Informatik)|Pipe]] akzeptieren. Welche Parameter für ein Cmdlet verfügbar sind und welche Eigenschaften sie besitzen, kann mit <code>Get-Help</code> geprüft werden (z.&nbsp;B. <code>Get-Help -Name Get-NetIPAddress -Parameter *</code>).
Parameter werden nach dem Cmdlet mit <code>-Parametername [Wert]</code> angegeben
Zusätzlich zu Cmdlet-spezifischen Parametern gibt es auch sogenannte ''Common Parameter'', also allgemein verfügbare Parameter. Dazu zählt <code>-Verbose</code> zur Ausgabe von Detailinformationen, <code>-ErrorAction</code>, um festzulegen, wie bei einem Fehler verfahren werden soll oder <code>-WhatIf</code>, um sich ausgeben zu lassen, was passieren ''würde'', wenn man den Befehl ausführt, ohne dass tatsächlich Änderungen gemacht werden.
* Ein Parameter kann unterschiedliche Eigenschaften besitzen, so kann er beispielsweise einen Standardwert haben, erforderlich oder positionsbezogen sein oder Werte aus der [[Pipe (Informatik)|Pipe]] akzeptieren
 
* Welche Parameter für ein Cmdlet verfügbar sind und welche Eigenschaften sie besitzen, kann mit <code>Get-Help</code> geprüft werden (z.&nbsp;B. <code>Get-Help -Name Get-NetIPAddress -Parameter *</code>)
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|.NET]]-Klasse) und einem ''Manifest'', das den Inhalt des Moduls beschreibt.<ref name="UnderstandingPowerShellModule">[https://msdn.microsoft.com/en-us/library/dd878324(v=vs.85).aspx msdn.microsoft.com: Understanding a Windows PowerShell Module]</ref> In PowerShell 1.0 war es ausschließlich über '''PSSnapins''' (Snap-ins) möglich, Cmdlets zu laden. Dies wurde jedoch durch die Funktion der Module ersetzt.<ref name="AboutPSSnapins">[https://msdn.microsoft.com/en-us/powershell/reference/5.0/microsoft.powershell.core/about/about_pssnapins msdn.microsoft.com PowerShell Referenz: about_PSSnapins]</ref>
Zusätzlich zu Cmdlet-spezifischen Parametern gibt es auch sogenannte ''Common Parameter'', also allgemein verfügbare Parameter
* Dazu zählt <code>-Verbose</code> zur Ausgabe von Detailinformationen, <code>-ErrorAction</code>, um festzulegen, wie bei einem Fehler verfahren werden soll oder <code>-WhatIf</code>, um sich ausgeben zu lassen, was passieren ''würde'', wenn man den Befehl ausführt, ohne dass tatsächlich Änderungen gemacht werden


=== PowerShell Provider ===
Module sind die bevorzugte Art, um Cmdlets zu veröffentlichen und in PowerShell zu laden
''PowerShell Provider'' (auch ''PSProvider'') bieten den Zugriff 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 [[Registrierungsdatenbank|Registry]], [[Active Directory]] und der Zertifikatsspeicher. In allen Laufwerken (zum Beispiel <code>C:</code>, <code>D:</code>, <code>Env:</code>, <code>HKLM:</code> oder <code>Cert:</code>) kann gleichermaßen navigiert oder Elemente verarbeitet werden (<code>Set-Location</code>, <code>Get-ChildItem</code>, <code>Remove-Item</code>, …).
* Module bestehen aus dem Cmdlet-Programmcode (als PowerShell-Skript oder [[.NET Framework|.NET]]-Klasse) und einem ''Manifest'', das den Inhalt des Moduls beschreibt
* In PowerShell 1.0 war es ausschließlich über '''PSSnapins''' (Snap-ins) möglich, Cmdlets zu laden
* Dies wurde jedoch durch die Funktion der Module ersetzt


==== Liste von Providern ====
=== Provider ===
Folgende Liste zeigt einige der Standardprovider in PowerShell.
; PowerShell Provider
''PowerShell Provider'' (auch ''PSProvider'') bieten den Zugriff 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 [[Registrierungsdatenbank|Registry]], [[Active Directory]] und der Zertifikatsspeicher
* In allen Laufwerken (zum Beispiel <code>C:</code>, <code>D:</code>, <code>Env:</code>, <code>HKLM:</code> oder <code>Cert:</code>) kann gleichermaßen navigiert oder Elemente verarbeitet werden (<code>Set-Location</code>, <code>Get-ChildItem</code>, <code>Remove-Item</code>, …)


{| class="wikitable sortable"
; Standardprovider in PowerShell
{| class="wikitable sortable options big"
|-
|-
! Name !! Typ !! Aufgabe
! 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 <syntaxhighlight lang="powershell" inline>Get-ChildItem Alias:</syntaxhighlight>) abrufen.
| 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 <syntaxhighlight lang="powershell" inline copy>Get-ChildItem Alias:</syntaxhighlight>) abrufen
|-
|-
| Environment || Container || Bindet ein logisches Laufwerk mit dem Namen „env:“ ein. Über dieses Laufwerk lassen sich die [[Umgebungsvariable]]n abfragen.
| Environment || Container || Bindet ein logisches Laufwerk mit dem Namen „env:“ ein. Über dieses Laufwerk lassen sich die [[Umgebungsvariable]]n 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.&nbsp;ä., 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.
| 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.&nbsp;ä., 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 <syntaxhighlight lang="powershell" inline>New-Item</syntaxhighlight> erstellt oder in einem PowerShell-Skript deklariert wurden.
| Function || Container || Verwaltet Funktionen, welche mit <syntaxhighlight lang="powershell" inline copy>New-Item</syntaxhighlight> 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 <code>HKEY_LOCAL_MACHINE</code>) und „HKLU:“ (für <code>HKEY_LOCAL_USER</code>) erstellt. Weitere Laufwerke lassen sich bei Bedarf mit <syntaxhighlight lang="powershell" inline>New-PSDrive</syntaxhighlight> (z.&nbsp;B. <syntaxhighlight lang="powershell" inline>New-PSDrive -name HKU -psprovider Registry -root HKEY_USERS</syntaxhighlight>) anlegen.
| Registry || Navigation || Ermöglicht unter Windows den Zugriff auf die [[Registrierungsdatenbank]]
* Standardmäßig werden die Laufwerke „HKLM:“ (für <code>HKEY_LOCAL_MACHINE</code>) und „HKLU:“ (für <code>HKEY_LOCAL_USER</code>) erstellt
* Weitere Laufwerke lassen sich bei Bedarf mit <syntaxhighlight lang="powershell" inline copy>New-PSDrive</syntaxhighlight> (z.&nbsp;B. <syntaxhighlight lang="powershell" inline copy>New-PSDrive -name HKU -psprovider Registry -root HKEY_USERS</syntaxhighlight>) anlegen
|-
|-
| Variable || Container || Verwaltet die im PowerShell-Host erstellten Variablen und deren Werte und bindet diese als logisches Laufwerk „Variable:“ ein.
| 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 <syntaxhighlight lang="powershell" inline>Get-PSProvider</syntaxhighlight> nicht aufgelistet.
| Certificate || Navigation || Verwaltet die Sicherheitszertifikate des Systems und bindet sich als logisches Laufwerk „Cert:“ ein
* Der Certificate-Provider wird von <syntaxhighlight lang="powershell" inline copy>Get-PSProvider</syntaxhighlight> nicht aufgelistet
|}
|}


== Objekte und Pipes ==
Andere Kommandozeileninterpreter wie [[Cmd.exe]], [[Bash (Shell)|Bash]] oder [[Digital Command Language|DCL]] sind textbasiert, wohingegen PowerShell mit Objekten arbeitet
* Objekte können Eigenschaften (''Properties''), Methoden (''Methods'') und Ereignisse (''Events'') enthalten
<code>Get-Member</code> zeigt den Typ sowie die Eigenschaften und Methoden von Objekten


== Objekte und die Pipe ==
Für die Systemverwaltung/Administration bedeutet dies, dass Ergebnisse von Befehlen nicht mehr als Text (unstrukturierte Daten), sondern Objekte (strukturierte Daten) vorliegen
Andere Kommandozeileninterpreter wie [[Cmd.exe]], [[Bash (Shell)|Bash]] oder [[Digital Command Language|DCL]] sind textbasiert, wohingegen PowerShell mit Objekten arbeitet. Objekte können Eigenschaften (''Properties''), Methoden (''Methods'') und Ereignisse (''Events'') enthalten.
* Dies wirkt sich auch auf die [[Pipe (Informatik)|Pipe]] aus
<code>Get-Member</code> 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. Dies wirkt sich auch auf die [[Pipe (Informatik)|Pipe]] aus.


Die Pipe (<code>|</code>) in textbasierten Kommandozeileninterpretern verbindet die Standardausgabe <code>stdout</code> mit der Standardeingabe <code>stdin</code> des darauffolgenden Befehls. 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: <code>ByValue</code> oder <code>ByPropertyName</code>. Bei <code>ByValue</code> muss der Objekttyp in der Pipe mit dem geforderten Objekttyp übereinstimmen. Bei <code>ByPropertyName</code> muss der Name einer Eigenschaft des Objekts mit dem Namen des Parameters des Folgebefehls übereinstimmen. <code>ByValue</code> wird <code>ByPropertyName</code> gegenüber bevorzugt.
Die Pipe (<code>|</code>) in textbasierten Kommandozeileninterpretern verbindet die Standardausgabe <code>stdout</code> mit der Standardeingabe <code>stdin</code> des darauffolgenden Befehls
* 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: <code>ByValue</code> oder <code>ByPropertyName</code>
* Bei <code>ByValue</code> muss der Objekttyp in der Pipe mit dem geforderten Objekttyp übereinstimmen
* Bei <code>ByPropertyName</code> muss der Name einer Eigenschaft des Objekts mit dem Namen des Parameters des Folgebefehls übereinstimmen. <code>ByValue</code> wird <code>ByPropertyName</code> gegenüber bevorzugt


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


Dieses Modell ist anfangs komplex, jedoch ergeben sich dadurch in der Praxis auch Vorteile beim Filtern und Verarbeiten von Informationen, wie folgende Beispiele verdeutlichen sollen.
Dieses Modell 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.
; Beispiel 1
Es sollen alle gestoppten Dienste eines entfernten Computers gestartet werden, mit einer Ausgabe, welche Dienste gestartet wurden


<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
Zeile 405: Zeile 358:
</syntaxhighlight>
</syntaxhighlight>


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 (Dateiformat)|CSV]]-Datei abgespeichert werden.
; 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 (Dateiformat)|CSV]]-Datei abgespeichert werden


<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
Zeile 419: Zeile 373:
</syntaxhighlight>
</syntaxhighlight>


 
; Dynamische Typisierung
PowerShell arbeitet bei Objekten mit einer [[Dynamische Typisierung|dynamischen Typisierung]]. Dabei kommt ein erweitertes Typsystem ([[Englische Sprache|englisch]]: ''{{lang|en|extended type system}}'', ''ETS'') zum Einsatz, bei dem .NET-Objekte in der [[Klasse (Objektorientierung)|Klasse]] <syntaxhighlight lang="csharp" inline>PSObject</syntaxhighlight> gekapselt werden. <syntaxhighlight lang="csharp" inline>PSObject</syntaxhighlight> stellt hierbei die Basisklasse für PowerShell-Objekte dar. <syntaxhighlight lang="csharp" inline>PSObject</syntaxhighlight> entspricht damit einer [[Monade (Informatik)|Monade]].
PowerShell arbeitet bei Objekten mit einer [[Dynamische Typisierung|dynamischen Typisierung]]
* Dabei kommt ein erweitertes Typsystem ([[Englische Sprache|englisch]]: ''{{lang|en|extended type system}}'', ''ETS'') zum Einsatz, bei dem .NET-Objekte in der [[Klasse (Objektorientierung)|Klasse]] <syntaxhighlight lang="csharp" inline copy>PSObject</syntaxhighlight> gekapselt werden. <syntaxhighlight lang="csharp" inline copy>PSObject</syntaxhighlight> stellt hierbei die Basisklasse für PowerShell-Objekte dar. <syntaxhighlight lang="csharp" inline copy>PSObject</syntaxhighlight> entspricht damit einer [[Monade (Informatik)|Monade]]


{|
{|
Zeile 430: Zeile 385:
namespace PowerShell
namespace PowerShell
{
{
    public class PSObjectExample
public class PSObjectExample
    {
{
        public void Main()
public void Main()
        {
{
            var time = DateTime.UtcNow;
var time = DateTime.UtcNow;
            var powerTime = new PSObject(time);
var powerTime = new PSObject(time);
        }
}
    }
}
}
}
</syntaxhighlight>
</syntaxhighlight>
Zeile 455: Zeile 410:
|}
|}


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


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


== Skripte ==
== Skripte ==
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 <code>.ps1</code> und werden mit dem Befehl <code>.</code>, gefolgt vom vollständigen Namen der Datei geladen und verarbeitet.
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 <code>.ps1</code> und werden mit dem Befehl <code>.</code>, gefolgt vom vollständigen Namen der Datei geladen und verarbeitet


; Beispiel
; Beispiel
Zeile 509: Zeile 468:
<#
<#
.SYNOPSIS
.SYNOPSIS
    Hello World Application.
Hello World Application


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


.NOTES
.NOTES
    File Name: Write-Hello.ps1
File Name: Write-Hello.ps1


.EXAMPLE
.EXAMPLE
    Write-Hello
Write-Hello
    Hello World!
Hello World!


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


.EXAMPLE
.EXAMPLE
    greet "World"
greet "World"
    Hello World!
Hello World!


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


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


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


.ALIAS
.ALIAS
    greet
greet


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


.INPUTTYPE
.INPUTTYPE
    Takes a name of type [string].
Takes a name of type [string]


.RETURNVALUE
.RETURNVALUE
    Output a greeting of type [string].
Output a greeting of type [string]


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


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


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


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


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


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


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


    end {
end {


    }
}
}
}


Zeile 607: Zeile 567:
Gib die Zeichenfolge [[Hallo-Welt-Programm|"Hallo Welt!"]] auf der [[Kommandozeile|Konsole]] aus:
Gib die Zeichenfolge [[Hallo-Welt-Programm|"Hallo Welt!"]] auf der [[Kommandozeile|Konsole]] aus:
<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
  Write-Host "Hallo Welt!"
Write-Host "Hallo Welt!"
</syntaxhighlight>
</syntaxhighlight>
<code>Write-Host</code> erzwingt dabei die Ausgabe auf der Konsole. Die Ausgabe wird nicht an die Pipeline weitergegeben und kann nicht weiterverarbeitet werden. <code>Write-Output</code> würde die Ausgabe sowohl an die Konsole, als auch die Pipeline weitergeben.
<code>Write-Host</code> erzwingt dabei die Ausgabe auf der Konsole
* Die Ausgabe wird nicht an die Pipeline weitergegeben und kann nicht weiterverarbeitet werden. <code>Write-Output</code> würde die Ausgabe sowohl an die Konsole, als auch die Pipeline weitergeben


Hole alle [[Prozess (Informatik)|Prozesse]], deren Namen mit dem Buchstaben „p“ beginnen:
Hole alle [[Prozess (Informatik)|Prozesse]], deren Namen mit dem Buchstaben „p“ beginnen:
<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
  Get-Process p*
Get-Process p*
</syntaxhighlight>
</syntaxhighlight>


Zeile 619: Zeile 580:
Hole alle Prozesse, die mehr als 10 MB Hauptspeicher verwenden:
Hole alle Prozesse, die mehr als 10 MB Hauptspeicher verwenden:
<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
  Get-Process | where { $_.WS -gt 10MB }
Get-Process | where { $_.WS -gt 10MB }
</syntaxhighlight>
</syntaxhighlight>
<code>where</code> ist ein Alias für <code>Where-Object</code> und filtert das ausgegebene Objekt von <code>Get-Process</code> auf alle Elemente die als Eigenschaft WS (<code>$_.WS</code>) einen Wert größer 10&nbsp;MB haben. PowerShell kennt die Maßeinheit [[Byte]] und rechnet 10&nbsp;MB in 10485760 um.
<code>where</code> ist ein Alias für <code>Where-Object</code> und filtert das ausgegebene Objekt von <code>Get-Process</code> auf alle Elemente die als Eigenschaft WS (<code>$_.WS</code>) einen Wert größer 10&nbsp;MB haben
* PowerShell kennt die Maßeinheit [[Byte]] und rechnet 10&nbsp;MB in 10485760 um




Berechne die Gesamtanzahl der Bytes aller Dateien in einem Verzeichnis:
Berechne die Gesamtanzahl der Bytes aller Dateien in einem Verzeichnis:
<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
  Get-ChildItem | Measure-Object -Property Length -Sum
Get-ChildItem | Measure-Object -Property Length -Sum
</syntaxhighlight>
</syntaxhighlight>


Zeile 632: Zeile 594:
Warte, bis ein bestimmter Prozess beendet wurde:
Warte, bis ein bestimmter Prozess beendet wurde:
<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
  $processToWatch = Get-Process notepad
$processToWatch = Get-Process notepad
  $processToWatch.WaitForExit()
$processToWatch.WaitForExit()
</syntaxhighlight>
</syntaxhighlight>


Zeile 639: Zeile 601:
Ändere eine [[Zeichenkette]] von Kleinbuchstaben in Großbuchstaben:
Ändere eine [[Zeichenkette]] von Kleinbuchstaben in Großbuchstaben:
<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
  "hallo welt!".ToUpper()
"hallo welt!".ToUpper()
</syntaxhighlight>
</syntaxhighlight>


Zeile 645: Zeile 607:
Füge die Zeichenfolge „ABC“ nach dem ersten Buchstaben des Wortes „string“ ein, um als Ergebnis „sABCtring“ zu erhalten:
Füge die Zeichenfolge „ABC“ nach dem ersten Buchstaben des Wortes „string“ ein, um als Ergebnis „sABCtring“ zu erhalten:
<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
  "string".Insert(1, "ABC")
"string".Insert(1, "ABC")
</syntaxhighlight>
</syntaxhighlight>


Zeile 651: Zeile 613:
Lade einen bestimmten [[RSS (Web-Feed)|RSS]]-[[Web-Feed]] herunter und zeige die Überschriften der acht neuesten Einträge:
Lade einen bestimmten [[RSS (Web-Feed)|RSS]]-[[Web-Feed]] herunter und zeige die Überschriften der acht neuesten Einträge:
<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
  $rssUrl = "https://devblogs.microsoft.com/powershell/feed/"
$rssUrl = "https://devblogs.microsoft.com/powershell/feed/"
  $blog = [xml] (New-Object System.Net.WebClient).DownloadString($rssUrl)
$blog = [xml] (New-Object System.Net.WebClient).DownloadString($rssUrl)
  $blog.rss.channel.item | select title -First 8
$blog.rss.channel.item | select title -First 8
</syntaxhighlight>
</syntaxhighlight>


Zeile 659: Zeile 621:
Lösche die komplette Festplatte ohne Rückfrage, Äquivalent zu <span style="font-family:monospace;">rm -rf /</span> unter Unix:
Lösche die komplette Festplatte ohne Rückfrage, Äquivalent zu <span style="font-family:monospace;">rm -rf /</span> unter Unix:
<syntaxhighlight lang="powershell">
<syntaxhighlight lang="powershell">
  Get-PSDrive -p "FileSystem" | % { ls -Recurse $_.Root | rm –Force }
Get-PSDrive -p "FileSystem" | % { ls -Recurse $_.Root | rm -Force }
</syntaxhighlight>
</syntaxhighlight>


== Dateiendungen ==
== Dateiendungen ==
* .ps1 – Windows PowerShell [[Shellskript]]
{| class="wikitable options"
* .ps1xml – Windows PowerShell Format- und Typdefinitionen
* .psc1 – Windows PowerShell Konsolendatei (exportierte Shell-Konfiguration)
* .psd1 – Windows PowerShell Datendatei
* .psm1 – Windows PowerShell Moduldatei
 
== Software-Unterstützung ==
Unterstützt werden unter anderem folgende Systeme:
 
{| class="wikitable sortable"
|-
|-
! Software
! Datei !! Beschreibung
! class="unsortable"| Version
! Cmdlets
! Provider
! Grafische Benutzeroberfläche
|-
|[[Microsoft Exchange Server]]
|2007
|{{Ja-Feld}} (402)
|{{Ja-Feld}}
|{{Ja-Feld}}
|-
|[[Microsoft Exchange Server]]
|2010
|{{Ja-Feld}}
|{{Ja-Feld}}
|{{Ja-Feld}}
|-
|[[Microsoft Windows|Microsoft Windows Server]]
|[[Microsoft Windows Server 2008|2008]]
|{{Ja-Feld}}
|{{Ja-Feld}}
|{{Nein-Feld}}
|-
|[[Microsoft Windows|Microsoft Windows Server]]
|[[Microsoft Windows Server 2008#Server Core|2008 Core]]
|{{Nein-Feld}}
|{{Nein-Feld}}
|{{Nein-Feld}}
|-
|[[Microsoft Windows|Microsoft Windows Server]]
|[[Microsoft Windows Server 2008 R2]]
|{{Ja-Feld}}
|{{Nein-Feld}}
|{{Nein-Feld}}
|-
|[[Microsoft SQL Server]]
|2008
|{{Ja-Feld}}
|{{Ja-Feld}}
|{{Nein-Feld}}
|-
|[[SharePoint]]
|2010, 2013
|{{Ja-Feld}}
|{{Ja-Feld}}
|{{Nein-Feld}}
|-
|-
|[[Microsoft System Center Operations Manager]]
| .ps1 || Windows PowerShell [[Shellskript]]
|2007
|{{Ja-Feld}} (74)
|{{Ja-Feld}}
|{{Nein-Feld}}
|-
|-
|[[Microsoft System Center Virtual Machine Manager]]
| .ps1xml || Windows PowerShell Format- und Typdefinitionen
|2007
|{{Ja-Feld}}
|{{Ja-Feld}}
|{{Ja-Feld}}
|-
|-
|[[Microsoft System Center Data Protection Manager]]
| .psc1 || Windows PowerShell Konsolendatei (exportierte Shell-Konfiguration)
|2007
|{{Ja-Feld}}
|{{Nein-Feld}}
|{{Nein-Feld}}
|-
|-
|[[Microsoft Windows Compute Cluster Server]]
| .psd1 || Windows PowerShell Datendatei
|2007
|{{Ja-Feld}}
|{{Ja-Feld}}
|{{Nein-Feld}}
|-
|-
|Microsoft Transporter Suite for [[Lotus Notes|Lotus Domino]]<ref>{{Internetquelle |url=http://www.microsoft.com/downloads/details.aspx?familyid=35fc4205-792b-4306-8e4b-0de9cce72172&displaylang=en |titel=Microsoft Transporter Suite for Lotus Domino |abruf=2008-02-18}}</ref>
| .psm1 || Windows PowerShell Moduldatei
|08.02.0012
|{{Ja-Feld}} (47)
|{{Nein-Feld}}
|{{Nein-Feld}}
|-
|Microsoft PowerTools for [[Office Open XML|Open XML]]<ref>{{Internetquelle |url=http://www.codeplex.com/PowerTools |titel=PowerTools for Open XML |abruf=2008-06-20}}</ref>
|1.0
|{{Ja-Feld}} (33)
|{{Nein-Feld}}
|{{Nein-Feld}}
|-
|[[WebSphere#WebSphere MQ|IBM WebSphere MQ]]<ref>{{Internetquelle |url=http://www-1.ibm.com/support/docview.wss?rs=171&uid=swg24017698 |titel=MO74: WebSphere MQ – Windows Powershell Library |abruf=2008-02-18}}</ref>
|6.0.2.2
|{{Ja-Feld}} (44)
|{{Nein-Feld}}
|{{Nein-Feld}}
|-
|Quest Management Shell for Active Directory<ref>{{Internetquelle |url=http://www.quest.com/powershell/activeroles-server.aspx |titel=PowerShell Commands for Active Directory by Quest Software |abruf=2008-07-02}}</ref>
|1.1
|{{Ja-Feld}} (40)
|{{Nein-Feld}}
|{{Nein-Feld}}
|-
|[[SpecOps Password Policy|Special Operations Software Specops Command]]<ref>{{Internetquelle |url=http://www.specopssoft.com/powershell/ |titel=PowerShell Remoting through Group Policy |abruf=2008-02-18}}</ref>
|1.0
|{{Ja-Feld}}
|{{Nein-Feld}}
|{{Ja-Feld}}
|-
|[[VMware|VMware Infrastructure Toolkit]]<ref>{{Internetquelle |url=http://www.vmware.com/sdk/vitk_win/ |titel=VMware Infrastructure Toolkit for Windows |abruf=2008-11-26 |archiv-url=https://web.archive.org/web/20081121201154/http://www.vmware.com./sdk/vitk_win/ |archiv-datum=2008-11-21 |offline=1}}</ref>
|1.0 Update 1
|{{Ja-Feld}} (125)
|{{Nein-Feld}}
|{{Nein-Feld}}
|-
|[[Microsoft Internet Information Services|Internet Information Services]]<ref>{{Internetquelle |url=http://blogs.msdn.com/powershell/archive/2008/07/03/iis7-powershell-provider-tech-preview-2.aspx |titel=Windows PowerShell: IIS7 PowerShell Provider Tech Preview 2 |abruf=2008-07-03}}</ref>
|7.0
|{{Ja-Feld}} (54)
|{{Ja-Feld}}
|{{Nein-Feld}}
|-
|[[Microsoft Windows 7]] Troubleshooting Center
|6.1
|{{Ja-Feld}}
|{{Nein-Feld}}
|{{Ja-Feld}}
|-
|[[Microsoft Deployment Toolkit]]
|2010
|{{Ja-Feld}}
|{{Nein-Feld}}
|{{Nein-Feld}}
|-
|[[LOGINventory]]
|5.x
|{{Ja-Feld}}
|{{Ja-Feld}}
|{{Ja-Feld}}
|-
|[[Citrix XenApp]]
|seit v5.x
|{{Ja-Feld}}
|{{Ja-Feld}}
|{{Ja-Feld}}
|-
|[[Citrix XenDesktop]]
|seit v5.x
|{{Ja-Feld}}
|{{Ja-Feld}}
|{{Ja-Feld}}
|}
|}
== Anhang ==
=== Siehe auch ===
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}
=== Dokumentation ===
=== Links ===
==== Projekt ====
==== Weblinks ====
# https://de.wikipedia.org/wiki/PowerShell
[[Kategorie:Shell]]
[[Kategorie:.NET]]
[[Kategorie:Windows-Betriebssystemkomponente]]
[[Kategorie:Skriptsprache]]
</noinclude>

Aktuelle Version vom 11. Mai 2025, 20:56 Uhr

PowerShell - plattformübergreifendes Framework von Microsoft zur Automatisierung, Konfiguration und Verwaltung von Systemen, das einen Kommandozeileninterpreter inklusive Skriptsprache bietet

Beschreibung

Windows PowerShell basiert auf der Common Language Runtime (CLR) des .NET Frameworks und wird mit Windows als Teil des Windows Management Frameworks (WMF) unter einer proprietären Lizenz ausgeliefert

  • Seit 2016 gibt es Windows PowerShell auch als Core Edition, welche wie PowerShell Core auf .NET Core basiert und als Teil von Windows Nano Server und Windows IoT ausgeliefert wird
  • Seit Version 6 basiert PowerShell auf der Core Common Language Runtime (CoreCLR) und ist als plattformübergreifendes Open-Source-Projekt
Software-Unterstützung

Zahlreiche Systeme wie Microsoft Exchange Server, Microsoft SQL Server oder Citrix XenDesktop unterstützen die Powershell.

Aufbau

PowerShell wurde für die Systemverwaltung und -automatisierung entworfen

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

Engine

PowerShell Engine

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-Klassen, die in einer DLL (System.Management.Automation.dll) gespeichert sind

Host

PowerShell Host

Der PowerShell Host ist die Benutzerschnittstelle zur PowerShell Engine

  • In Windows steht standardmäßig die Windows PowerShell (auch Konsole) (powershell.exe, bereitgestellt durch conhost.exe) und Windows PowerShell ISE (Integrated Scripting 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

Scripting Language

PowerShell Scripting Language (PSL)

Die PowerShell Scripting Language (PSL) ist die Sprache um Skripte für die PowerShell Engine zu entwickeln

  • Ab Version 2.0 kann die Skriptsprache auch verwendet werden, um eigene Cmdlets zu erstellen

Die PowerShell-Sprache basiert auf dem IEEE 1003.2 POSIX Shell Standard und die Syntax ist an der Programmiersprache C# angelehnt 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

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 Standalone-Anwendungen, das heißt, sie können nicht ohne die PowerShell ausgeführt werden
  • Cmdlets können .NET-Klassen 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
  • Die PowerShell-Engine bzw. Standard-Cmdlets nehmen Cmdlet-Entwicklern Arbeit von Standardaufgaben ab und vereinfachen und beschleunigen die Entwicklung
  • Gleichzeitig wird die Nutzbarkeit und Lesbarkeit von Skripten und Befehlen durch sehr strikte und ausführliche Namenskonventionen gewährleistet

Die Anzahl der vorinstallierten Cmdlets steigt mit jeder Version

  • Sie liegt in der Version 5.1 der Legacy-PowerShell bei 489 Cmdlets und 766 mitgelieferten Funktionen und in der Core-Version 6.1 bei 287 Cmdlets und 145 mitgelieferten Funktionen im Kernpaket und 1900 Cmdlets mit zusätzlichen Modulen

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 über die Pipe (|) von anderen Cmdlets weiterverarbeitet werden
  • So ist es möglich, übergebene Objekte zu filtern (z. B. Select-Object -Property Name,Status, Where-Object -Property Status -EQ -Value Stopped), zu konvertieren (z. B. Converto-Json) oder auszugeben (z. B. Out-File, Out-GridView) (siehe auch Objekte und die Pipe)

Microsoft hat eine Liste mit erlaubten Verben veröffentlicht

  • Die Einhaltung der Verben wird nicht technisch erzwungen
  • Sie wird jedoch empfohlen, um die Bedienung zu vereinheitlichen
  • 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, das Umsteigen von anderen Systemen zu erleichtern 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 jedoch 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 help, man help man Hilfe zu Befehlen
Get-Command 1.0 gcm Listet alle im derzeitigen Kontext verfügbaren Befehle und Aliase auf
Get-Alias 1.0 gal alias Listet Aliase für Befehle auf
Get-Location 1.0 gl, pwd cd pwd Ausgabe des aktuellen Verzeichnisses
Set-Location 1.0 sl, cd, chdir cd, chdir cd Wechseln des aktuellen Verzeichnisses
Clear-Host 3.0 cls, clear cls clear Löschen der Ausgabe
Copy-Item 1.0 cpi, copy, cp copy cp Kopieren einer oder mehrerer Dateien / eines ganzen Verzeichnisbaums
Remove-Item 1.0 ri, del, erase, rmdir, rd, rm del, rmdir, rd rm, rmdir Löschen einer Datei / eines Verzeichnisses
Rename-Item 1.0 rni, ren ren mv Umbenennen einer Datei / eines Verzeichnisses
Move-Item 1.0 mi, move, mv move mv Verschieben einer Datei / eines Verzeichnisses
Get-ChildItem 1.0 gci, dir, ls dir ls Liste aller Dateien / Verzeichnisse im (aktuellen) Verzeichnis
Write-Host 1.0 echo, write echo echo Ausgabe von Zeichenketten, Variablen etc
  • in der Konsole
Pop-Location 1.0 popd popd popd In Verzeichnis wechseln, das zuletzt auf dem Stack abgelegt wurde
Push-Location 1.0 pushd pushd pushd Verzeichnis auf dem Stack ablegen
Set-Variable 1.0 sv, set set set Wert einer Variable setzen / Variable anlegen
Start-Process 2.0 saps start Startet ein Programm im eigenen Fenster
Get-Content 1.0 gc, type, cat type cat Ausgabe einer Datei
Select-String 1.0 sls find, findstr grep Suche und Filterung definierter Zeichenketten
Get-Process 1.0 gps, ps tlist, ps Liste aller momentan laufenden Prozesse
Stop-Process 1.0 spps, kill kill, kill Beenden eines laufenden Prozesses
Stop-Computer 2.0 shutdown shutdown, poweroff Herunterfahren des Rechners
Restart-Computer 2.0 shutdown -r reboot, shutdown -r Neustart des Rechners
Tee-Object 1.0 tee tee Standardeingabe in eine Datei oder Variable umleiten und entlang der Pipeline weiterreichen (Standardausgabe)
Get-NetIPAddress 3.0 gip ipconfig ifconfig Listet die Netzwerkschnittstellen mit Konfigurationsinformationen auf
Get-Acl 1.0 acl Listet die Zugriffsberechtigungen eines Ordners oder Dokuments auf
Get-Member 1.0 gm Listet die Mitglieder (Member-Variablen) eines Objektes auf
Get-PSSnapin 1.0 gsnp Listet die aktiven PowerShell-Erweiterungen auf
Export-Console 1.0 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 dass 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-Klasse) und einem Manifest, das den Inhalt des Moduls beschreibt
  • In PowerShell 1.0 war es ausschließlich über PSSnapins (Snap-ins) möglich, Cmdlets zu laden
  • Dies wurde jedoch durch die Funktion der Module ersetzt

Provider

PowerShell Provider

PowerShell Provider (auch PSProvider) bieten den Zugriff 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, …)
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

Objekte und Pipes

Andere Kommandozeileninterpreter wie Cmd.exe, Bash oder DCL sind textbasiert, 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

  • Dies wirkt sich auch auf die Pipe aus

Die Pipe (|) in textbasierten Kommandozeileninterpretern verbindet die Standardausgabe stdout mit der Standardeingabe stdin des darauffolgenden Befehls

  • 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 Parameters 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 Modell 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
Dynamische Typisierung

PowerShell arbeitet bei Objekten mit einer dynamischen Typisierung

  • Dabei kommt ein erweitertes Typsystem (englisch: Vorlage:Lang, 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 konvertiert 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

Skripte

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
<#
.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

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

 Write-Host "Hallo Welt!"

Write-Host erzwingt dabei die Ausgabe auf der Konsole

  • Die Ausgabe wird nicht an die Pipeline weitergegeben und kann nicht weiterverarbeitet werden. Write-Output würde die Ausgabe sowohl an die Konsole, als auch die Pipeline weitergeben

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

 Get-Process p*


Hole alle Prozesse, die mehr als 10 MB Hauptspeicher verwenden:

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

where ist ein Alias für Where-Object und filtert das ausgegebene Objekt von Get-Process auf alle Elemente die als Eigenschaft WS ($_.WS) einen Wert größer 10 MB haben

  • PowerShell kennt die Maßeinheit Byte und rechnet 10 MB in 10485760 um


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 = "https://devblogs.microsoft.com/powershell/feed/"
 $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

Datei Beschreibung
.ps1 Windows PowerShell Shellskript
.ps1xml Windows PowerShell Format- und Typdefinitionen
.psc1 Windows PowerShell Konsolendatei (exportierte Shell-Konfiguration)
.psd1 Windows PowerShell Datendatei
.psm1 Windows PowerShell Moduldatei

Anhang

Siehe auch


Dokumentation

Links

Projekt

Weblinks

  1. https://de.wikipedia.org/wiki/PowerShell