Bild

(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:

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

Links