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 Kommandozeile (cmd) und 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) interargiert.
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. Eine Dokumentation ist über Microsofts Webseite einsehbar.
Microsoft bietet Windows PowerShell ISE als Entwicklungsumgebung an (siehe Bild). 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 .ps1 Datei abgespeichert werden können. Das komplette Skript kann mit dem grünen Pfeil (F5) ausgeführt werden. Teile des Skriptes können markiert und mit dem grünen Zettel-Pfeil (F8) ausgeführt werden. Auf der rechten Seite ist eine Auflistung aller verfügbaren Befehle mit integrierter Hilfe. Die verfügbaren Befehle lassen sich auch durch die Eingabe get-command in der Kommandozeile aufrufen. Die Eingabe von cls löscht die Inhalte der Konsole.
Abgespeicherte .ps1-Skripte lassen sich mittels Rechtsklick und "Mit PowerShell ausführen" aufrufen. Alternativ können wir über die Kommandozeile mit dem Befehl chdir Pfad (z. B. chdir H:\) in das Verzeichnis navigieren, in dem das Skript abgelegt wurde und es durch Eingabe von .\Skriptname.ps1 ausführen.
Befehle können über die integrierte Hilfe in Windows PowerShell ISE oder mit Hilfe der Eingabe von get-command in die Kommdanozeile gefunden werden. Durch Eingabe von get-command -Name *print* in die Kommdanozeile werden alle Befehle aufgerufen, die im Namen "print" enthalten (siehe Bild). -Name ist dabei ein Positionsparameter und *print* ist das dazugehörige Argument.
Variablen werden mit $ gekennzeichnet.
Beispiel:
$MeinName = "Hans"
Eingabe von $MeinName in die Konsole liefert Hans. "Mein Name ist $MeinName" liefert Mein Name ist Hans und 'Mein Name ist $MeinName' liefert Mein Name ist $MeinName.
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 Get-Process Cmdlet, um ein Objekt abzurufen, das den Editorprozess darstellt. Es verwendet einen Pipelineoperator (|), um das Prozessobjekt an das Stop-Process Cmdlet zu senden, das den Editorprozess beendet. Beachten Sie, dass der Stop-Process Befehl keinen Parameter "Name " oder " ID " enthält, um den Prozess anzugeben, da der angegebene Prozess über die Pipeline übermittelt wird.
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.
# STRG Mausrad, Größe ändern
# Hilfe wie get-command get-help
# Parameter können eingefügt werden
# Kompatibilität mit der Kommandozeile
# Die meisten Kommdanozeilen-Befehle lassen sich auch direkt in der Powershell ausführen.
# Dafür sind meist Aliase ( Verweise auf die entsprechenden Powershell-Befehle)
# oder Funktionen implementiert, die die Kompatibilität herstellen
$PSVersionTable # Variable, die die Powershell Version zurückgibt
get-command -Name *-service* #listet alle Kommandos die -service enthalten
Dir C:\Windows #directory
mkdir c:\Temp #make directory
rd c:\Temp #remove directory
man #Linux Kommando Powershell Hilfe
ls #list
ipconfig /all
get-alias ls #ls verweist auf Get-ChildItem
# einfach Commandlets einsetzen
# viele Commandlets funktionieren durch Eingabe des Befehls ohne weitere Optionen
Get-Process # Anzeigen der laufenden Prozess (= tasklist.exe)
.\notepad.exe #relativer Pfad wird angegeben
Get-Process -Name notepad
Stop-Process -Name notepad
Get-Command # alle verfügbaren Befehle anzeigen
Get-Help # Hilfe
Update-Help
Get-Service # Alle installierten Dienste und ihren Status anzeigen
Get-HotFix # Installierte Updates anzeigen
Get-Printer # Drucker anzeigen
Get-WindowsDriver -Online -All # Alle Windows-Treiber - 2 Parameter
$MeinName = "Hans" # Variable wird belegt
$Service = Get-Service
#" erkennt Variablen, ' erkennt keine Variablen
Get-Printer
Get-PrintConfiguration -PrinterName "OneNote for Windows 10" | Select-Object -Property Printername, Duplexingmode # | Leitet den Befehl weiter
Get-PrintConfiguration -PrinterName "OneNote for Windows 10" | Select-Object -Property * # | Leitet den Befehl weiter, * gibt alle Eigenschaften wieder
Get-NetIPInterface #verfügbare Netzwerkschnittstellen auflisten
Get-NetIPAddress -AddressFamily IPv4 -PrefixOrigin Dhcp #IP-Adressen auflisten
# Parameter übergeben dem Cmdlet weitere Optionen. -<Parametername> <Argument>, nicht alle Parameter haben ein Argument. (z . B. -online, -all -> Switch Parameter (ein/aus))
# Dienste konfigurieren
Set-Service -Name wuauserv -StartupType Disabled
Stop-Service -Name wuauserv
#Mit Netzwerk-Schnittstellen und IP-Adressen arbeiten
Get-NetIPInterface -ConnectionState Disconnected # Alle Netzwerk-Schnittstellen ausgeben, die keine Verbindung haben
Get-NetIPInterface -Dhcp Enabled # Netzwerkschnittstellen ausgeben, die DHCP aktiviert haben
Get-NetIPInterface -InterfaceAlias 'Lan-Verbindung' # Netzwerkschnittstelle mit Name Lan Verbindung
Get-NetFirewallProfile
Set-NetFirewallProfile -All -Enabled true # Die Firewall für alle Profile aktivieren
Test-NetConnection -ComputerName 'Nwfs' # ähnlich zu Ping
Get-AppxPackage -Name *help* | Remove-AppxPackage # löscht alle Apps in denen der Name help vorkommt für das aktuelle Benutzerprofil
Get-AppxPackage | Out-GridView -PassThru # Tabellensicht
Get-AppxProvisionedPackage -Name *help* | Remove-AppxPackage # löscht alle Apps in denen der Name help vorkommt für alle Benutzerprofile
Get-AppxPackage | Where-Object Name -EQ "Microsoft.GetHelp"
Get-Help about_comparison_operators -ShowWindow
Get-AppxPackage | Select-Object -Property Name,PackageFamilyName
# Daten Im-Export csv, xml, json html, xls und mehr
Get-AppxPackage | Out-GridView -PassThru | export-csv -Path C:\apps.csv -Delimiter ";" -Encoding UTF8
Import-Csv -Delimiter ";" -Path C:\apps.csv | Remove-AppxPackage # könnte problematisch werden, da Daten beim Ex-Importieren verloren gehen können, besser wie folgt:
Get-AppxPackage | Out-GridView -PassThru | Export-Clixml -Path C:\apps.xml # speziell für PowerShell
Get-AppxPackage | ConvertTo-Json | Out-File -FilePath C:\apps.json
Get-ChildItem
Get-Help
# Webseiten abrufen
Invoke-WebRequest -Uri www.google.de | Select-Object -Property links # Objekt kein Inhalt
$Website = Invoke-WebRequest -Uri www.google.de
$website.links.href # nur links der Website
((Invoke-WebRequest -Uri www.google.de).Links).href # Befehle in Klammern werden zuerst ausgeführt
# Arbeiten mit dem Eventlog
Get-EventLog -LogName Application -EntryType Error -After '2020-03-30 17:00'
Get-WinEvent -ListLog *Power*
Get-WinEvent -LogName "Windows Powershell"
Get-WinEvent -FilterHashtable @{Logname="*Hyper*"
Providername="Microsoft"
ID=2008
Level=4} #in einer Zeile Semikolon setzen
# Umgebungsvariablen
$env:COMPUTERNAME
#Pfaden
Test-Path C:\ -PathType Container # testet ob der Pfad existiert und gibt true oder false zurück
Split-Path -Path C:\Windows -Parent # Pfade auftrennen
Split-Path -Path C:\Windows -leaf # Pfade auftrennen
Join-Path -path C:\Windows -ChildPath Hans # Pfade zusammenführen
# Objekteigenschaften
(Get-NetIPAddress -AddressFamily IPv4).IPAddress
# virtuelle Festplatte
new-vhd -path D:\test.vhdx -sizeBytes 50gb -dynamic #anlegen
new-vhd -path D:\test_diff.vhdx -ParentPath D:\test.vhdx # Differenzdatei anlegen
mount-vhd -path D:\test_diff.vhdx
cls #löscht Bildschirminhalte