PowerShell: Unterschied zwischen den Versionen

Aus FLBK-Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
'''PowerShell''' ist ein plattformübergreifendes Framework von Microsoft, zur Automatisierung, Konfiguration und Verwaltung von Systemen, das einen Kommandozeileninterpreter inklusive Skriptsprache bietet. Es ersetzt unter Windows die klassische Kommandzeile (cmd) und ist seit Windows 7 sowie Windows Server 2008 R2 verfügbar. PowerShell ist eine Shell (Hülle), also eine Software mittels derer ein Benutzer mit dem Betriebssystem (Kern) interagiert.
'''PowerShell''' ist ein plattformübergreifendes Framework von Microsoft zur Automatisierung, Konfiguration und Verwaltung von Systemen. Es bietet einen [[Interpreter|Kommandozeileninterpreter]] inklusive [[Skriptsprache]]. Unter Windows ersetzt es die klassische Kommandzeile (cmd) und ist seit Windows 7 sowie Windows Server 2008 R2 verfügbar. PowerShell ist eine Shell (Hülle), also eine Software, mit der Benutzer mit dem Betriebssystem (Kern) interagieren.


== Funktionen ==
== Funktionen ==


PowerShell bietet insbesondere '''Cmdlets''' (Commandlets). Dies sind einfache PowerShell-Befehle. Neue Cmdlets lassen sich mit Modulen nachinstallieren. Zusätzlich bietet PowerShell '''Alias''', welches Befehle sind, die auf Cmdlets verweisen und '''Funktionen''', welche PowerShell-Skripte sind.
PowerShell bietet insbesondere '''Cmdlets''' (Commandlets). Dies sind einfache PowerShell-Befehle. Neue Cmdlets lassen sich mit Modulen nachinstallieren. Zusätzlich bietet PowerShell '''Alias''' (Kurzbefehle) und '''Funktionen''' (PowerShell-Skripte).


=== Variablen ===
=== Variablen ===
Variablen werden mit $ gekennzeichnet.
Variablen werden mit <code>$</code> gekennzeichnet.


Beispiel:
Beispiel:
Zeile 13: Zeile 13:
</syntaxhighlight>
</syntaxhighlight>


Eingabe von <code>$MeinName</code> in die Konsole liefert ''Hans''. <code>"Mein Name ist $MeinName"</code> liefert ''Mein Name ist Hans'' und <code>'Mein Name ist $MeinName'</code> liefert ''Mein Name ist $MeinName''.
Eingabe von <code>$MeinName</code> in die Konsole liefert ''Hans''.
<code>"Mein Name ist $MeinName"</code> liefert ''Mein Name ist Hans''
<code>'Mein Name ist $MeinName'</code> liefert ''Mein Name ist $MeinName''.


=== Pipelineoperator ===
=== Pipelineoperator ===
Befehle können über den Pipelineoperator <code>|</code> verbunden werden. Jeder Pipelineoperator sendet die Ergebnisse des vorherigen Befehls an den nächsten Befehl.
Befehle können über den Pipelineoperator <code>|</code> verbunden werden.
Jeder Pipelineoperator sendet die Ergebnisse des vorherigen Befehls an den nächsten Befehl.


Beispiel:
Beispiel:
Zeile 23: Zeile 26:
</syntaxhighlight>
</syntaxhighlight>


Der erste Befehl verwendet das <code>Get-Process</code>-Cmdlet, um ein Objekt abzurufen, das den Editorprozess darstellt. Es verwendet einen Pipelineoperator (<code>|</code>), um das Prozessobjekt an das <code>Stop-Process</code>-Cmdlet zu senden, das den Editorprozess beendet.
Der erste Befehl verwendet das Cmdlet <code>Get-Process</code>, um ein Objekt des Prozesses abzurufen. Über den Pipelineoperator <code>|</code> wird dieses Objekt an <code>Stop-Process</code> übergeben, das den Prozess beendet.


=== Kontrollstrukturen ===
=== Kontrollstrukturen ===
PowerShell bietet Methoden zum Erstellen von Schleifen, zum Treffen von Entscheidungen und zur logischen Steuerung des Codeflusses. Beispielsweise können switch-case, if-else oder for-Schleifen verwendet werden.
PowerShell bietet Schleifen, Bedingungen und logische Steuerungen wie:
* <code>if-else</code>
* <code>switch</code>
* <code>for</code>


== Entwicklungsumgebung ==
== Entwicklungsumgebung ==


Microsoft bietet '''Windows PowerShell ISE''' (Integrated Scripting Environment) als Entwicklungsumgebung an. Im unteren Bereich ist die PowerShell-Konsole, die sich auch separat unter Windows öffnen lässt. Hier können Cmdlets oder Alias direkt eingegeben und ausgeführt werden. Der obere Teil bietet einen Texteditor mit dem Skripte geschrieben und als <code>.ps1</code>-Datei abgespeichert werden können.
Microsoft stellt die '''Windows PowerShell ISE''' (Integrated Scripting Environment) bereit.
Unten befindet sich die Konsole, oben ein Editor zum Schreiben und Speichern von Skripten als <code>.ps1</code>-Dateien.


Das komplette Skript kann mit dem grünen Pfeil (F5) ausgeführt werden.
* Ausführen des kompletten Skripts: <kbd>F5</kbd> 
 
* Ausführen markierter Teile: <kbd>F8</kbd> 
Teile des Skriptes können markiert und mit F8 ausgeführt werden.
* Verfügbare Befehle anzeigen: <code>get-command</code>
 
* Konsole leeren: <code>cls</code>
Auf der rechten Seite ist eine Auflistung aller verfügbaren Befehle mit integrierter Hilfe.
 
Die verfügbaren Befehle lassen sich auch durch die Eingabe von <code>get-command</code> in der Kommandozeile aufrufen.
 
Die Eingabe von <code>cls</code> löscht die Inhalte der Konsole.


== Skripte ausführen ==
== Skripte ausführen ==


Abgespeicherte <code>.ps1</code>-Skripte lassen sich mittels Rechtsklick und "Mit PowerShell ausführen" aufrufen. Alternativ kann über die Kommandozeile mit dem Befehl <code>chdir Pfad</code> (z. B. <code>chdir H:</code>) in das Verzeichnis navigiert werden, in dem das Skript abgelegt wurde und it durch Eingabe von <code>.\Skriptname.ps1</code> ausgeführt werden.
Gespeicherte <code>.ps1</code>-Skripte lassen sich über Rechtsklick "Mit PowerShell ausführen" starten.
Alternativ:
<syntaxhighlight lang="powershell">
chdir H:
.\Skriptname.ps1
</syntaxhighlight>


== Befehle finden ==
== Befehle finden ==


Befehle können über die integrierte Hilfe in Windows PowerShell ISE oder mit Hilfe der Eingabe von <code>get-command</code> in die Kommandozeile gefunden werden. Durch Eingabe von <code>get-command -Name print</code> in die Kommandozeile werden alle Befehle aufgerufen, die im Namen "print" enthalten. <code>-Name</code> ist dabei ein Positionsparameter und <code>print</code> ist das dazugehörige Argument.
Über die integrierte Hilfe oder:
<syntaxhighlight lang="powershell">
get-command
get-command -Name print
</syntaxhighlight>


== Hilfreiche Cmdlets ==
== Hilfreiche Cmdlets ==


=== Grundlagen und Hilfesystem ===
=== Grundlagen und Hilfesystem ===
* '''STRG + Mausrad''': Ändert die Schriftgröße in der Konsole.
* '''STRG + Mausrad''': Schriftgröße ändern
* '''<code>Get-Help</code>''': Zeigt die Hilfeseite zu einem Cmdlet an (z.B. <code>Get-Help Get-Process</code>).
* <code>Get-Help</code> – Hilfe anzeigen
* '''<code>Update-Help</code>''': Lädt die neuesten Hilfedateien herunter.
* <code>Update-Help</code> Hilfedateien aktualisieren
* '''<code>Get-Command</code>''': Listet alle verfügbaren Befehle auf.
* <code>Get-Command</code> – Alle Befehle auflisten
** <code>Get-Command -Name *-service*</code>: Findet Cmdlets, die "-service" im Namen enthalten.


=== Kompatibilität mit Cmd & Linux ===
=== Kompatibilität mit Cmd & Linux ===
Die meisten klassischen Kommandozeilen-Befehle (Cmd/Bash) funktionieren in PowerShell durch integrierte '''Aliase''' oder '''Funktionen'''.
Viele klassische Befehle funktionieren durch Aliase:
* <code>dir</code> → Get-ChildItem
* <code>ls</code> → Get-ChildItem
* <code>ipconfig /all</code> → Direkt ausgeführt
* <code>mkdir</code> → New-Item
* <code>rd</code> → Remove-Item
* <code>man</code> → Get-Help
* <code>cls</code> → Clear-Host


* '''Typische Aliase:'''
Alias prüfen:
** <code>dir</code> → Get-ChildItem
<syntaxhighlight lang="powershell">
** <code>ls</code> → Get-ChildItem
Get-Alias ls
** <code>ipconfig /all</code> → Wird direkt ausgeführt
</syntaxhighlight>
** <code>mkdir</code> → New-Item
** <code>rd</code> → Remove-Item
** <code>man</code> → Get-Help
** <code>cls</code> → Clear-Host
* '''Alias abfragen:''' <code>Get-Alias ls</code> zeigt, welches Cmdlet sich hinter <code>ls</code> verbirgt.


=== Einfache Cmdlets für den Einstieg ===
=== Einfache Cmdlets ===
Viele Cmdlets liefern mit der Eingabe des bloßen Befehls bereits nützliche Informationen.
* Prozesse:
<syntaxhighlight lang="powershell">
Get-Process
Get-Process -Name notepad
Stop-Process -Name notepad
.\notepad.exe
</syntaxhighlight>


* '''Prozesse:'''
* Systeminformationen:
** <code>Get-Process</code>: Zeigt alle laufenden Prozesse an (wie <code>tasklist.exe</code>).
<syntaxhighlight lang="powershell">
** <code>Get-Process -Name notepad</code>: Zeigt alle Notepad-Prozesse.
$PSVersionTable
** <code>Stop-Process -Name notepad</code>: Beendet alle Notepad-Prozesse.
Get-Service
** Prozess starten: <code>.\notepad.exe</code> (relativer Pfad)
Get-HotFix
Get-WindowsDriver -Online -All
</syntaxhighlight>


* '''Systeminformationen:'''
* Drucker:
** <code>$PSVersionTable</code>: Zeigt die PowerShell-Version an.
<syntaxhighlight lang="powershell">
** <code>Get-Service</code>: Listet alle Dienste und ihren Status auf.
Get-Printer
** <code>Get-HotFix</code>: Zeigt installierte Updates.
Get-PrintConfiguration -PrinterName "Druckername"
** <code>Get-WindowsDriver -Online -All</code>: Listet alle Windows-Treiber auf.
</syntaxhighlight>


* '''Drucker:'''
=== Parameter ===
** <code>Get-Printer</code>: Zeigt konfigurierte Drucker an.
* Parameter mit Argument:
** <code>Get-PrintConfiguration -PrinterName "Druckername"</code>: Zeigt Konfiguration eines bestimmten Druckers.
<syntaxhighlight lang="powershell">
-Name "wuauserv"
</syntaxhighlight>
* Switch-Parameter:
<syntaxhighlight lang="powershell">
-Online
-All
</syntaxhighlight>


=== Arbeiten mit Parametern ===
=== Systemkonfiguration ===
Parameter werden mit <code>-Parametername</code> übergeben. Es gibt zwei Typen:
* Dienste:
* '''Parameter mit Argument:''' <code>-Name "wuauserv"</code>
<syntaxhighlight lang="powershell">
* '''Switch-Parameter (ein/aus):''' <code>-Online</code>, <code>-All</code>
Set-Service -Name wuauserv -StartupType Disabled
Stop-Service -Name wuauserv
</syntaxhighlight>


=== Beispiele: Systemkonfiguration ===
* Netzwerk:
* '''Dienste konfigurieren:'''
<syntaxhighlight lang="powershell">
** <code>Set-Service -Name wuauserv -StartupType Disabled</code>
Get-NetIPInterface
** <code>Stop-Service -Name wuauserv</code>
Get-NetIPAddress -AddressFamily IPv4 -PrefixOrigin Dhcp
Test-NetConnection -ComputerName 'Nwfs'
Set-NetFirewallProfile -All -Enabled true
</syntaxhighlight>


* '''Netzwerk:'''
* Apps verwalten:
** <code>Get-NetIPInterface</code>: Listet Netzwerkschnittstellen auf.
<syntaxhighlight lang="powershell">
** <code>Get-NetIPAddress -AddressFamily IPv4 -PrefixOrigin Dhcp</code>: Zeigt IPv4-Adressen, die von DHCP bezogen wurden.
Get-AppxPackage -Name *help* | Remove-AppxPackage
** <code>Test-NetConnection -ComputerName 'Nwfs'</code>: Ähnlich wie <code>ping</code>, aber leistungsstärker.
Get-AppxPackage | Out-GridView -PassThru
** <code>Set-NetFirewallProfile -All -Enabled true</code>: Aktiviert die Firewall für alle Profile.
</syntaxhighlight>
 
* '''Apps verwalten (Windows 10/11):'''
** <code>Get-AppxPackage -Name *help* | Remove-AppxPackage</code>: Entfernt Apps mit "help" im Namen für den aktuellen Benutzer.
** <code>Get-AppxPackage | Out-GridView -PassThru</code>: Zeigt Apps in einer grafischen Tabelle zur Auswahl.


=== Daten Im- und Export ===
=== Daten Im- und Export ===
PowerShell kann Daten in verschiedenen Formaten exportieren und importieren.
Export:
<syntaxhighlight lang="powershell">
... | Export-Csv -Path C:\data.csv -Delimiter ";" -Encoding UTF8
... | Export-Clixml -Path C:\data.xml
... | ConvertTo-Json | Out-File -FilePath C:\data.json
</syntaxhighlight>


* '''Export:'''
Import:
** <code>... | Export-Csv -Path C:\data.csv -Delimiter ";" -Encoding UTF8</code>
<syntaxhighlight lang="powershell">
** <code>... | Export-Clixml -Path C:\data.xml</code> (PowerShell-spezifisches Format)
Import-Csv -Delimiter ";" -Path C:\data.csv
** <code>... | ConvertTo-Json | Out-File -FilePath C:\data.json</code>
</syntaxhighlight>


* '''Import:''' <code>Import-Csv -Delimiter ";" -Path C:\data.csv</code>
=== Arbeiten mit Objekten und der Pipeline ===
<syntaxhighlight lang="powershell">
Get-PrintConfiguration -PrinterName "Drucker" | Select-Object -Property Printername, Duplexingmode
Get-PrintConfiguration -PrinterName "Drucker" | Select-Object -Property *
(Get-NetIPAddress -AddressFamily IPv4).IPAddress
</syntaxhighlight>


=== Arbeiten mit Objekten und der Pipeline (|) ===
=== Weitere Befehle ===
Die Stärke von PowerShell ist die Weitergabe von Objekten (nicht nur Text) zwischen Cmdlets.
* Webanfragen:
<syntaxhighlight lang="powershell">
(Invoke-WebRequest -Uri www.google.de).Links.href
</syntaxhighlight>


* '''Pipeline-Beispiele:'''
* Eventlog:
** <code>Get-PrintConfiguration -PrinterName "Drucker" | Select-Object -Property Printername, Duplexingmode</code>
<syntaxhighlight lang="powershell">
** <code>Get-PrintConfiguration -PrinterName "Drucker" | Select-Object -Property *</code> (zeigt alle Eigenschaften)
Get-EventLog -LogName Application -EntryType Error -After '2020-03-30'
Get-WinEvent -FilterHashtable @{Logname="*Hyper*"; Providername="Microsoft"; ID=2008; Level=4}
</syntaxhighlight>


* '''Objekteigenschaften auslesen:'''
* Umgebungsvariablen:
** <code>(Get-NetIPAddress -AddressFamily IPv4).IPAddress</code>
<syntaxhighlight lang="powershell">
$env:COMPUTERNAME
</syntaxhighlight>


=== Weitere nützliche Befehle ===
* Pfade:
* '''Webanfragen:'''
<syntaxhighlight lang="powershell">
** <code>(Invoke-WebRequest -Uri www.google.de).Links.href</code> Extrahiert alle Links von einer Webseite.
Test-Path C:\ -PathType Container
 
Split-Path -Path C:\Windows -Parent
* '''Eventlog:'''
Join-Path -Path C:\Windows -ChildPath Ordner
** <code>Get-EventLog -LogName Application -EntryType Error -After '2020-03-30'</code>
</syntaxhighlight>
** <code>Get-WinEvent -FilterHashtable @{Logname="*Hyper*"; Providername="Microsoft"; ID=2008; Level=4}</code>
 
* '''Umgebungsvariablen:'''
** <code>$env:COMPUTERNAME</code>
 
* '''Pfade:'''
** <code>Test-Path C:\ -PathType Container</code> (Prüft, ob ein Pfad existiert)
** <code>Split-Path -Path C:\Windows -Parent</code> / <code>-Leaf</code>
** <code>Join-Path -Path C:\Windows -ChildPath Ordner</code>
 
* '''Virtuelle Festplatten:'''
** <code>New-VHD -Path D:\test.vhdx -SizeBytes 50GB -Dynamic</code>
** <code>Mount-VHD -Path D:\test.vhdx</code>


* Virtuelle Festplatten:
<syntaxhighlight lang="powershell">
New-VHD -Path D:\test.vhdx -SizeBytes 50GB -Dynamic
Mount-VHD -Path D:\test.vhdx
</syntaxhighlight>


[[Kategorie:Skriptsprache]]
[[Kategorie:Programmierung]]
[[Kategorie:FI_I_SDM]]
[[Kategorie:FI_I_SDM]]

Aktuelle Version vom 6. September 2025, 11:15 Uhr

PowerShell ist ein plattformübergreifendes Framework von Microsoft zur Automatisierung, Konfiguration und Verwaltung von Systemen. Es bietet einen Kommandozeileninterpreter inklusive Skriptsprache. Unter Windows ersetzt es die klassische Kommandzeile (cmd) und ist seit Windows 7 sowie Windows Server 2008 R2 verfügbar. PowerShell ist eine Shell (Hülle), also eine Software, mit der Benutzer mit dem Betriebssystem (Kern) interagieren.

Funktionen

PowerShell bietet insbesondere Cmdlets (Commandlets). Dies sind einfache PowerShell-Befehle. Neue Cmdlets lassen sich mit Modulen nachinstallieren. Zusätzlich bietet PowerShell Alias (Kurzbefehle) und Funktionen (PowerShell-Skripte).

Variablen

Variablen werden mit $ gekennzeichnet.

Beispiel:

$MeinName = "Hans"

Eingabe von $MeinName in die Konsole liefert Hans. "Mein Name ist $MeinName" liefert Mein Name ist Hans, 'Mein Name ist $MeinName' liefert Mein Name ist $MeinName.

Pipelineoperator

Befehle können über den Pipelineoperator | verbunden werden. Jeder Pipelineoperator sendet die Ergebnisse des vorherigen Befehls an den nächsten Befehl.

Beispiel:

Get-Process notepad | Stop-Process

Der erste Befehl verwendet das Cmdlet Get-Process, um ein Objekt des Prozesses abzurufen. Über den Pipelineoperator | wird dieses Objekt an Stop-Process übergeben, das den Prozess beendet.

Kontrollstrukturen

PowerShell bietet Schleifen, Bedingungen und logische Steuerungen wie:

  • if-else
  • switch
  • for

Entwicklungsumgebung

Microsoft stellt die Windows PowerShell ISE (Integrated Scripting Environment) bereit. Unten befindet sich die Konsole, oben ein Editor zum Schreiben und Speichern von Skripten als .ps1-Dateien.

  • Ausführen des kompletten Skripts: F5
  • Ausführen markierter Teile: F8
  • Verfügbare Befehle anzeigen: get-command
  • Konsole leeren: cls

Skripte ausführen

Gespeicherte .ps1-Skripte lassen sich über Rechtsklick → "Mit PowerShell ausführen" starten. Alternativ:

chdir H:
.\Skriptname.ps1

Befehle finden

Über die integrierte Hilfe oder:

get-command
get-command -Name print

Hilfreiche Cmdlets

Grundlagen und Hilfesystem

  • STRG + Mausrad: Schriftgröße ändern
  • Get-Help – Hilfe anzeigen
  • Update-Help – Hilfedateien aktualisieren
  • Get-Command – Alle Befehle auflisten

Kompatibilität mit Cmd & Linux

Viele klassische Befehle funktionieren durch Aliase:

  • dir → Get-ChildItem
  • ls → Get-ChildItem
  • ipconfig /all → Direkt ausgeführt
  • mkdir → New-Item
  • rd → Remove-Item
  • man → Get-Help
  • cls → Clear-Host

Alias prüfen:

Get-Alias ls

Einfache Cmdlets

  • Prozesse:
Get-Process
Get-Process -Name notepad
Stop-Process -Name notepad
.\notepad.exe
  • Systeminformationen:
$PSVersionTable
Get-Service
Get-HotFix
Get-WindowsDriver -Online -All
  • Drucker:
Get-Printer
Get-PrintConfiguration -PrinterName "Druckername"

Parameter

  • Parameter mit Argument:
-Name "wuauserv"
  • Switch-Parameter:
-Online
-All

Systemkonfiguration

  • Dienste:
Set-Service -Name wuauserv -StartupType Disabled
Stop-Service -Name wuauserv
  • Netzwerk:
Get-NetIPInterface
Get-NetIPAddress -AddressFamily IPv4 -PrefixOrigin Dhcp
Test-NetConnection -ComputerName 'Nwfs'
Set-NetFirewallProfile -All -Enabled true
  • Apps verwalten:
Get-AppxPackage -Name *help* | Remove-AppxPackage
Get-AppxPackage | Out-GridView -PassThru

Daten Im- und Export

Export:

... | Export-Csv -Path C:\data.csv -Delimiter ";" -Encoding UTF8
... | Export-Clixml -Path C:\data.xml
... | ConvertTo-Json | Out-File -FilePath C:\data.json

Import:

Import-Csv -Delimiter ";" -Path C:\data.csv

Arbeiten mit Objekten und der Pipeline

Get-PrintConfiguration -PrinterName "Drucker" | Select-Object -Property Printername, Duplexingmode
Get-PrintConfiguration -PrinterName "Drucker" | Select-Object -Property *
(Get-NetIPAddress -AddressFamily IPv4).IPAddress

Weitere Befehle

  • Webanfragen:
(Invoke-WebRequest -Uri www.google.de).Links.href
  • Eventlog:
Get-EventLog -LogName Application -EntryType Error -After '2020-03-30'
Get-WinEvent -FilterHashtable @{Logname="*Hyper*"; Providername="Microsoft"; ID=2008; Level=4}
  • Umgebungsvariablen:
$env:COMPUTERNAME
  • Pfade:
Test-Path C:\ -PathType Container
Split-Path -Path C:\Windows -Parent
Join-Path -Path C:\Windows -ChildPath Ordner
  • Virtuelle Festplatten:
New-VHD -Path D:\test.vhdx -SizeBytes 50GB -Dynamic
Mount-VHD -Path D:\test.vhdx