Tags: PowerShell, System-Management
Mit geplanten Aufgaben lassen sich Programme und Scripts zeitgesteuert oder abhängig von bestimmten Ereignissen ausführen. Seit der Version 4.0 kann auch PowerShell solche Tasks verwalten. Für das Anlegen einer neuen Aufgabe muss man meist mehrere Cmdlets bemühen.
Die Aufgabenplanung ist ein mächtiges Werkzeug, das Microsoft für eine Reihe von Systemprozessen selbst nutzt. Typische Kandidaten für die zeitgesteuerte Ausführung sind etwa Backup- oder Defragmentierprogramme. Neben zeitlich festgelegten Aktionen kennt die Aufgabenverwaltung noch mehrere Auslöser, um eine Anwendung oder ein Script zu starten (Anmelden eines Benutzers, Start des Systems, etc.).
Einstellungen mit separaten Cmdlets vorbereiten
Anstatt eine neue Aufgabe auf der grafischen Oberfläche zusammenzuklicken, kann man sie auch mit PowerShell erstellen. Das ist vor allem dann interessant, wenn man eine Task für Server Core oder Nano Server erstellen will, wo man keine GUI hat. Unter Nano Server könnte man damit das Herunterladen und Installieren von Updates automatisieren.
Da eine geplante Aufgabe zahlreiche Einstellungen vorsieht, verteilt PowerShell das Anlegen einer neuen Task auf mehrere Cmdlets. So muss man etwa den Auslöser für eine Aufgabe als eigenes Objekt definieren und dann bei der Registrierung der Task angeben. Das Gleiche gilt für die auszuführende Aktion sowie die zahlreichen Optionen einer geplanten Aufgabe.
Zeitplan festlegen
Daher ruft man im ersten Schritt New-ScheduledTaskTrigger auf und legt dort fest, wann oder unter welchen Bedingungen die Aufgabe ausgelöst werden soll.
Zur Auswahl stehen dort die Parameter Once, Daily und Weekly, für die man mit dem Schalter -At die Uhrzeit angibt, zu der die Task starten soll. Alternativ kann man sich für die Ereignisse AtStartup und AtLogon entscheiden, die beim Booten des PCs oder dem Anmelden des Benutzers zutreffen.
$trig = New-ScheduledTaskTrigger -Daily -At 21:00 -DaysInterval 2
Dieser Befehl definiert einen Trigger, der eine Aktion alle zwei Tage um 21:00 auslöst und speichert das Objekt vom Typ MSFT_TaskWeeklyTrigger für die spätere Verwendung in der Variable $trig. Das nächste Beispiel erzeugt einen Trigger, der jeden Montag und Freitag um 21:00 startet:
$trig = New-ScheduledTaskTrigger -weekly -At 21:00 -DaysOfWeek @("Monday","Friday")
Auszuführende Aktion definieren
Im darauf folgenden Schritt definiert man mit dem Cmdlet New-ScheduledTaskAction die Aktion, die von der Aufgabenplanung künftig zeit- oder ereignisgesteuert ausgeführt wird:
$action = New-ScheduledTaskAction -WorkingDirectory $env:TEMP `
-Execute c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe `
-Argument "-Command 'Remove-Item *.tmp -Force -Recurse'"
Dieser Aufruf legt fest, dass zum gegebenen Zeitpunkt PowerShell starten und alle Dateien vom Typ *.tmp in %TEMP% löschen soll.
Zusätzliche Optionen auswählen
Schließlich kann man noch mit New-ScheduledTaskSettingsSet verschiedene Einstellungen konfigurieren.
Dazu zählen unter anderem, dass die Aufgabe startet, wenn der PC untätig ist (RunOnlyIfIdle), im Akkubetrieb läuft (AllowStartIfOnBatteries) oder über eine bestimmte Netzwerkverbindung verfügt (NetworkName).
$conf = New-ScheduledTaskSettingsSet -RunOnlyIfIdle -WakeToRun
Dieser Befehl würde festlegen, dass die Task nur läuft, wenn sich der PC im Leerlauf befindet und dass ihn die Aufgabenplanung aus dem Standby aufwecken darf. Sämtliche unterstützte Schalter finden sich in der TechNet-Beschreibung des Cmdlets.
Task registrieren
Nun kann man sich daran machen, die Task in die Aufgabenverwaltung einzutragen. Hier könnte man den Zwischenschritt über New-ScheduledTask nehmen, das aber nur ein Objekt mit der Task-Definition erzeugt und dieses noch nicht im System registriert.
Der eigentlichen Definition einer neuen Aufgabe dient das Cmdlet Register-ScheduledTask. Neben der bereits vordefinierten Aktion, dem Trigger und den Einstellungen aus den obigen Aufrufen erwartet es noch den Namen der Task. Auf Wunsch kann man noch den Account angeben, unter dem die Aufgabe laufen soll, oder die Position im Aufgabenpfad sowie diverse weitere Eigenschaften festlegen.
Register-ScheduledTask -TaskName DelTemp -TaskPath "\PS" `
-Action $action -Settings $conf -Trigger $trig
Dieses Kommando erstellt eine Aufgabe mit dem Namen DelTemp im Pfad \PS und mit den zuvor definierten Einstellungen für Aktion, Trigger und sonstige Optionen.
Bei Bedarf kann man den Befehl mit dem Parameter CimSession auch auf einen Remote-PC anwenden.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- ScriptRunner Portal Edition R5: Konfiguration von Abfragen, OpenID-Support, Web-API statt IIS
- Fehler in geplanten Aufgaben finden mit PowerShell
- WSUS-Bereinigung als geplante Aufgabe ausführen
- Programme (remote) mit PowerShell deinstallieren
- Geplante Aufgaben auf andere Rechner übertragen mit PowerShell
Weitere Links