(Foto: pixabay.com)
Automatisierung mit PowerShell
Wiederkehrende Aufgaben am Computer lassen sich bequem per Shell-Skript automatisieren. Zur Auswahl stehen die Bourne Shell (bsh), die Bourne Again Shell (bash), die C Shell (csh), die Korn Shell (ksh), PowerShell und viele mehr. Aber nur PowerShell ist als Open-Source-Projekt plattformübergreifend für Linux, MacOS und Windows unter der MIT-Lizenz verfügbar.
Von Markus Fleschutz · 📅 11. Januar 2019
Die Kommandozeile
Um PowerShell-Befehle auszuprobieren benötigt man eine Text-Konsole. Dazu bietet sich entweder Windows Terminal an (erhältlich im Windows App Store) oder die PowerShell-Konsole. Diese findet man bei Windows unter Start > Windows PowerShell
und wird in der Voreinstellung blau dargestellt.
PowerShell bietet unter anderem folgende Kommandos an:
- cat
- gibt den Inhalt der angegebenen Datei aus - cd
- wechselt in den angegeben Ordner - cd .. - wechselt eine Order-Ebene höher
- clear - löscht die Anzeige in Konsolen-Window
- cp
- kopiert die angegebene Datei - date - zeigt die Systemzeit des Rechners an
- diff
- zeigt den Unterschied beider Dateien an - echo
- gibt den angegebenen Text aus - echo $Variable - gibt den Inhalt der angegeben Variable aus
- exit - beendet die PowerShell-Konsole, bzw. das PowerShell-Script
- help - zeigt die Hilfe zu PowerShell-Cmdlets und -Konzepten an (sehr hilfreich !!!)
- history - zeigt die bisher eingegebenen Befehle an
- hostname - gibt den Namen des Rechners aus
- kill
- beendet den angegebenen Prozess - ls - listet den Inhalt eines Dateiordners
- mkdir
- erstellt einen Ordner mit dem angegebenen Namen - mv
- verschiebt die angegebene Datei - ping <hostname|IP adress> - prüft, ob der angegebene Rechner im Netzwerk erreichbar ist
- ps - listet alle gegenwärtig laufende Prozesse
- pwd - gibt den aktuellen Dateipfad aus
- rm
- löscht die angegebene Datei oder den angegebenen Ordner (!) - set
- setzt die angegebene Variable auf den angegebenen Wert - sleep
- wartet die angegebene Anzahl von Sekunden - wget
- lädt die angegebene Datei aus dem Internet herunter
Cmdlets
Die oben genannten Kommandos sind tatsächlich Aliase zu sogenannten "Cmdlets". Cmdlets bestehen immer aus einem Verb, einem Bindestrich und einem Nomen, zum Beispiel Get-ChildItem
(Datei-Ordner anzeigen). Mit Get-Command
und Show-Command
lassen sich Cmdlets suchen und finden. Welche Cmdlets zur Verfügung stehen, hängt nicht nur von der eingesetzten PowerShell-Version ab, sondern auch vom Betriebssystem und der installierten zusätzlichen Softwareausstattung. Cmdlets sind grundsätzlich in Modulen beheimatet.
PowerShell-Skripte schreiben
Mit einem beliebigen Texteditor erstellt man eine neue Datei namens HelloWorld.ps1
mit folgendem Inhalt:
echo "Hello, World!"
sleep 10
Danach die Datei abspeichern und mit einem Rechtsklick Mit PowerShell ausführen wählen. Schon wird das Skript ausgeführt.
PowerShell-Features
PowerShell ist mächtig! Die Möglichkeiten von PowerShell reichen schon fast an eine Programmiersprache heran. Und die nachfolgenden Beispiele funktionieren sowohl in einem PowerShell-Skript als auch in der PowerShell-Konsole. Also einfach mal ausprobieren!
Beispiel 1: Variablen & Zahlen
$PI = 3.1415927
echo $PI
Beispiel 2: Variablen & Text
$var = "Hi "
$var += "Jon"
echo $var
Beispiel 3: Variablen & Text Arrays
$days = "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"
foreach($day in $days) {
echo $day
}
Beispiel 4: Mehrere Variablen initialisieren
$a = $b = $c = 1
echo $a, $b, $c
$a, $b, $c = 1, 2, 3
echo $a, $b, $c
Beispiel 5: Variablen & Programmausgaben
$output = ls
echo $output
Beispiel 6: for-Schleifen
for($i = 0; $i -le 100; $i++) {
echo "Hi"
}
Beispiel 7: foreach-Schleifen
$colors = "red","green","blue"
foreach($color in $colors) {
echo $color
}
Beispiel 8: do-while-Schleifen
do {
echo "Hi"
} while ($false)
Beispiel 9: while-Schleifen
while ($true) {
echo "Hi"
break
}
Beispiel 10: Endlos-Schleifen
while ($true) {
echo "ENDLESS"
}
Beispiel 11: Kommentare
# Kommentar
1 + 1 # sollte 2 ergeben
Beispiel 12: Vergleichsoperatoren
1 -eq 1 # is equal?
0 -ne 1 # is not equal?
0 -lt 1 # is lower than?
0 -le 1 # is lower or equal?
1 -gt 0 # is greater?
1 -ge 0 # is greater or equal?
"PowerShell" -like "Pow*" # find with wildcards (opposite: -notlike)
"Jan","Feb","March" -contains "Feb" # find in arrays (opposite: -notcontains)
"PowerShell" -match "ower" # find substring (opposite: -notmatch)
1 -and 1 # logical AND
1 -or 0 # logical OR
1 -xor 0 # logical EXCLUSIVE OR
-not 0 # logical NOT
!0 # same as -not
Beispiel 13: Text-to-Speech (TTS)
$voice = New-Object –ComObject SAPI.SPVoice
$voice.Speak("Hi developer");
Beispiel 14: Zeit in HTML/JSON/CSV umwandeln
Get-Date | ConvertTo-Html
Get-Date | ConvertTo-Json
Get-Date | ConvertTo-CSV
Beispiel 15: Aliase in HTML umwandeln
Get-Alias | ConvertTo-Html | Out-File aliases.html
Beispiel 16 für Skripte: Benutzereingaben
$age = Read-Host "Enter your age"
echo $age
Beispiel 17 für Skripte: Passwort-Eingabe
$password = Read-Host "Enter password" -assecurestring
echo $password
Beispiel 18 für Skripte: Zeit messen
$start = Get-Date
# some code ...
$stop = Get-Date
$interval = New-Timespan -start $start -end $stop
echo "$interval"
Beispiel 19 für Skripte: Fehler abfangen
try {
# some code ...
} catch { Write-Error $Error[0] }
Beispiel 20 für Skripte: Funktionen
function MyPing {
$Hostname = $args[0]
Test-Connection $Hostname
}
MyPing 192.168.1.100
PowerShell Remoting
Mit PowerShell Remoting kann ein entfernter Rechner über SSH (Secure Shell) und PowerShell ferngesteuert werden. Dazu installiert und konfiguriert man den SSH-Server auf dem entfernten Rechner in einer PowerShell-Konsole mit Administrationsrechten wie folgt:
Add-WindowsCapability -Online -Name OpenSSH.Server*
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
und den SSH-Client auf dem lokalen Rechner mit:
Add-WindowsCapability -Online -Name OpenSSH.Client*
Jetzt kann man mit folgendem Kommando auf dem entfernten Rechner arbeiten:
ssh <USER>@<HOSTNAME>
Übliche Datei-Endungen in PowerShell
<filename>.PS1 → PowerShell Shell-Skript
<filename>.PS1XML → PowerShell Format- und Typdefinitionen
<filename>.PSC1 → PowerShell Konsolendatei (exportierte Shell-Konfiguration)
<filename>.PSD1 → PowerShell Datendatei
<filename>.PSM1 → PowerShell Moduldatei