PowerShell Scripts sind ein mächtiges Werkzeug zur Automatisierung wiederkehrender Aufgaben. Doch was, wenn diese Scripts nicht sofort, sondern zu bestimmten Zeiten oder in regelmäßigen Abständen ausgeführt werden sollen? In diesem Artikel zeige ich dir, wie du PowerShell Scripts auf Windows und Linux zeitversetzt ausführen kannst.

Was bedeutet “zeitversetzt ausführen”?

Zeitversetzte Ausführung bedeutet, dass ein Script nicht manuell gestartet wird, sondern automatisch zu einem vordefinierten Zeitpunkt oder in regelmäßigen Intervallen läuft. Das ist besonders nützlich für:

  • Backup-Scripts, die nachts laufen sollen
  • Berichte, die täglich generiert werden
  • Systemwartung in wartungsarmen Zeiten
  • Datenbereinigung in regelmäßigen Abständen

PowerShell Scripts unter Windows zeitversetzt ausführen

Methode 1: Windows Aufgabenplanung (Task Scheduler)

Die einfachste Methode unter Windows ist die Verwendung der integrierten Aufgabenplanung.

Über die grafische Oberfläche:

  1. Aufgabenplanung öffnen: Drücke Windows + R, gib taskschd.msc ein und drücke Enter
  2. Neue Aufgabe erstellen: Klicke rechts auf “Einfache Aufgabe erstellen”
  3. Namen vergeben: Gib deiner Aufgabe einen aussagekräftigen Namen
  4. Trigger festlegen: Wähle aus, wann die Aufgabe ausgeführt werden soll (täglich, wöchentlich, etc.)
  5. Aktion definieren: Wähle “Programm starten” und gib folgendes ein:
    • Programm: powershell.exe
    • Argumente: -ExecutionPolicy Bypass -File "C:\Pfad\zu\deinem\script.ps1"

Über PowerShell (für Fortgeschrittene):

# Neue geplante Aufgabe erstellen
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File C:\Scripts\MeinScript.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries

Register-ScheduledTask -TaskName "MeinPowerShellScript" -Action $action -Trigger $trigger -Settings $settings

PowerShell Scripts unter Linux zeitversetzt ausführen

Methode 1: Cron (der Standard-Weg)

Unter Linux ist cron das Standard-Tool für zeitgesteuerte Aufgaben.

Crontab bearbeiten:

# Crontab für den aktuellen Benutzer öffnen
crontab -e

Cron-Syntax verstehen:

# Minute Stunde Tag Monat Wochentag Befehl
# *      *     *   *     *         *
# |      |     |   |     |         |
# |      |     |   |     |         +-- Befehl
# |      |     |   |     +------------ Wochentag (0-7, Sonntag = 0 oder 7)
# |      |     |   +------------------ Monat (1-12)
# |      |     +---------------------- Tag (1-31)
# |      +----------------------------- Stunde (0-23)
# +------------------------------------ Minute (0-59)

Beispiele für Cron-Einträge:

# Täglich um 2:00 Uhr
0 2 * * * /usr/bin/pwsh /home/user/scripts/backup.ps1

# Jeden Montag um 9:30 Uhr
30 9 * * 1 /usr/bin/pwsh /home/user/scripts/weekly-report.ps1

# Alle 15 Minuten
*/15 * * * * /usr/bin/pwsh /home/user/scripts/monitor.ps1

# Am ersten Tag jedes Monats um Mitternacht
0 0 1 * * /usr/bin/pwsh /home/user/scripts/monthly-cleanup.ps1

Cross-Platform: Start-Sleep für einfache Verzögerungen

Das Start-Sleep Cmdlet ist die einfachste Methode, um eine Pause in dein PowerShell Script einzubauen. Es pausiert die Ausführung für eine bestimmte Zeit:

# 5 Sekunden warten
Start-Sleep -Seconds 5

# 2 Minuten warten
Start-Sleep -Seconds 120

# Oder mit Millisekunden für präziseres Timing
Start-Sleep -Milliseconds 1500  # 1,5 Sekunden

# Praktisches Beispiel: Script mit Verzögerung zwischen Aktionen
Write-Host "Starte Backup..."
Start-Backup
Start-Sleep -Seconds 30  # 30 Sekunden warten
Write-Host "Prüfe Backup-Status..."
Test-BackupStatus

Wichtig: Start-Sleep blockiert den aktuellen PowerShell-Prozess komplett. Für längere Wartezeiten oder parallele Ausführung solltest du PowerShell Jobs verwenden.

Wichtige Tipps für beide Systeme

1. Ausführungsberechtigungen beachten

Windows: Stelle sicher, dass die Execution Policy korrekt gesetzt ist:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Linux: PowerShell-Scripts benötigen Ausführungsrechte:

chmod +x /home/user/scripts/meinscript.ps1

2. Absolute Pfade verwenden

Verwende immer absolute Pfade zu deinen Scripts und Dateien, da zeitgesteuerte Tasks oft in einem anderen Arbeitsverzeichnis starten.

3. Logging implementieren

Füge Logging zu deinen Scripts hinzu, um Probleme zu identifizieren:

# Einfaches Logging
$logFile = "C:\Logs\meinscript.log"
"$(Get-Date): Script gestartet" | Out-File -Append -FilePath $logFile

try {
    # Dein Script-Code hier
    "$(Get-Date): Script erfolgreich beendet" | Out-File -Append -FilePath $logFile
}
catch {
    "$(Get-Date): Fehler - $($_.Exception.Message)" | Out-File -Append -FilePath $logFile
}

4. Umgebungsvariablen beachten

Zeitgesteuerte Scripts laufen oft mit minimalen Umgebungsvariablen. Setze wichtige Variablen explizit:

$env:PATH += ";C:\Programme\MeinTool"

Fazit

Die zeitversetzte Ausführung von PowerShell Scripts ist sowohl unter Windows als auch unter Linux problemlos möglich. Windows bietet mit der Aufgabenplanung eine benutzerfreundliche grafische Lösung, während Linux mit Cron und Systemd Timer flexiblere, aber textbasierte Optionen bereitstellt.

Die Wahl der Methode hängt von deinen spezifischen Anforderungen ab:

  • Für einfache, regelmäßige Aufgaben: Windows Task Scheduler oder Linux Cron
  • Für kurze Verzögerungen: PowerShell Start-Sleep

Wichtig ist in jedem Fall, dass du deine Scripts ausreichend testest und mit Logging versehen, um Probleme schnell identifizieren zu können. So stellst du sicher, dass deine Automatisierung zuverlässig funktioniert und dir langfristig Zeit spart.