Geplante Aufgaben auf andere Rechner übertragen mit PowerShell

    Geplante Aufgaben mit PowerShell bearbeitenWenn man eigene geplante Auf­gaben auf einen neuen Rechner migrieren will, dann bietet die grafische Aufgaben­planung dafür eine Import- und Export­funktion. Diese funktioniert aber immer nur für eine einzelne Task. PowerShell ist hier flexibler, hält aber ein paar Fall­stricke bereit.

    Geplante Aufgaben eignen sich für eine ganze Reihe von Anwendungen, typischer­weise für die Systemwartung. Ein Beispiel dafür ist die etwa die regelmäßige Neuindizierung der WSUS-Datenbank. Sie können aber nicht nur periodisch laufen, sondern auch abhängig von Ereignissen, etwa beim Logon oder Systemstart.

    Mehrere Management-Tools

    Für das Management von Scheduled Tasks bringt Windows mehrere Tools mit. Dazu zählen die MMC-basierte Aufgaben­planung, das Windows Admin Center, das Kommandozeilen-Tool schtask.exe oder PowerShell. Benötigt man bestimmte geplante Aufgaben auf vielen Rechnern, dann kann man sie auch über Gruppenrichtlinien erstellen.

    Das PowerShell-Modul ScheduledTasks umfasst aktuell 24 Cmdlets und Funktionen, mit denen sich praktisch die gesamte Verwaltung von geplanten Aufgaben erledigen lässt. Um sich die Eigenschaften von Tasks anzeigen zu lassen, die auf einen anderen Rechner übertragen werden sollen, ruft man Get-ScheduledTask auf.

    Aufgaben exportieren

    Da es ohne Parameter alle Aufgaben ausgibt, wird man in der Regel zumindest den TaskPath spezifizieren, unter dem sich die benötigten Aufgaben befinden, etwa

    Get-ScheduledTask -TaskPath \WSUS\

    Das Ergebnis kann man gleich an Export-ScheduledTask über eine Pipe weiteleiten und mit Out-File in eine Datei schreiben:

    Get-ScheduledTask -TaskPath \WSUS\| Export-ScheduledTask | OutFile mytask.xml

    Vorhandene geplante Aufgaben anzeigen mit Get-ScheduledTask.

    Wie man an der Namensendung der Ausgabedatei erkennt, konvertiert Export-ScheduledTask die Einstellungen der Aufgaben im XML-Format. Es handelt sich dabei um das gleiche, das auch die grafische Aufgaben­verwaltung nutzt.

    Schwierigkeiten treten auf, sobald sich beim obigen Befehl mehr als eine Aufgabe im angegebenen Pfad befindet. In diesem Fall gibt das Cmdlet zwar das XML der ersten Aufgabe korrekt aus, aber dann erhält man die irreführende Fehlermeldung

    Export-ScheduledTask : Falscher Parameter.

    Beim Versuch, mehrere Tasks gleichzeitig zu exportieren, steigt Export-ScheduledTask mit einem Fehler aus.

    Die Ursache liegt einfach darin, dass Export-ScheduledTask immer nur eine Aufgabe verarbeiten kann und scheitert, wenn es über die Pipeline mehrere davon erhält. Daher muss man das Cmdlet in einer Schleife aufrufen und so über alle Tasks iterieren:

    Get-ScheduledTask -TaskPath "\WSUS\" |
    foreach {Export-ScheduledTask -TaskName $_.TaskName -TaskPath "\WSUS\" |
    Out-File ($_.TaskName + ".xml") }

    Scheduled Tasks reimportieren

    Um die exportierten Aufgaben auf einem anderen Rechner einzulesen, wird man vergeblich nach einem Cmdlet namens Import-ScheduledTask suchen. Zuständig ist hier vielmehr Register-ScheduledTask, mit dem man ansonsten von Grund auf neue Aufgaben erstellen kann.

    In diesem Fall verwendet man es jedoch mit dem Parameter XML, um eine Task zu importieren. Der naheliegende Aufruf nach dem Muster

    Register-ScheduledTask -xml .\wartung.xml -TaskName MyTask

    führt jedoch zur Fehlermeldung:

    Register-ScheduledTask : Die Aufgaben-XML ist ungültig.
    (1,2)::FEHLER: Fehlerhafte Syntax in einem Dokument.

    Fehler beim Import einer geplanten Aufgabe aus einer XML-Datei

    Das Cmdlet erwartet die XML-Daten als einen String, ist aber nicht in der Lage, die Datei entsprechend einzulesen. Daher muss man mit Get-Content nachhelfen:

    Register-ScheduledTask -xml (Get-Content -Raw wartung.xml) -TaskName MyTask

    Erfolgreicher Import einer geplanten Aufgabe mit Register-ScheduledTask

    Möchte man mehrere exportierte Aufgaben einlesen, dann könnte man so vorgehen:

    dir *.xml |
    foreach {Register-ScheduledTask -xml (Get-Content -Raw $_.Name) -TaskName $_.BaseName}

    In diesem Beispiel würden die neuen Tasks die Namen der jeweiligen Exportdateien ohne Endung erhalten.

    Keine Kommentare