29Aug

Geek-Schule: Lernen Sie, wie Sie Jobs in PowerShell verwenden

click fraud protection

PowerShell verfügt über vier Arten von Jobs - Hintergrundjobs, Remotejobs, WMI-Jobs und geplante Jobs. Begleiten Sie uns, wenn wir herausfinden, was sie sind und wie wir sie nutzen können.

Lesen Sie die vorherigen Artikel in der Serie:

  • Erfahren Sie, wie Sie Windows mit PowerShell automatisieren
  • Lernen mit Cmdlets in PowerShell
  • Lernen Verwenden von Objekten in PowerShell
  • Lernen Formatieren, Filtern und Vergleichen in PowerShell
  • Lernen Sie, Remoting in zu verwendenPowerShell
  • Verwenden von PowerShell zum Abrufen von Computerinformationen
  • Arbeiten mit Collections in PowerShell

Und bleiben Sie während der ganzen Woche für den Rest der Serie dran.

Hintergrund-Jobs

Bis jetzt war alles, was ich Ihnen in PowerShell gezeigt habe, synchron gewesen, was bedeutet, dass wir etwas in die Shell eingeben und nicht viel tun können, bis der Befehl fertig ist. Hierhin kommen Hintergrundjobs. Um einen Hintergrund zu starten, übergeben Sie einfach einen Skriptblock an das Cmdlet Start-Job.

instagram viewer

Start-Job -Name GetFileList -Script-Block{ Get-ChildItem C: \ -Recurse}

Jetzt können wir innerhalb der Shell alles machen, was wir wollen, während dieser Skriptblock im Hintergrund ausgeführt wird.

Wenn Sie einen neuen Job starten, erstellt PowerShell ein neues Jobobjekt, das diesen Job darstellt. Sie können jederzeit eine Liste aller Jobs abrufen, indem Sie das Cmdlet Get-Job ausführen.

Die Jobobjekte informieren Sie über den Status der Jobs. Im obigen Screenshot sehen wir beispielsweise, dass wir einen BackgroundJob namens GetFileList haben, der noch läuft, aber bereits Daten zurückgibt. Wenn Sie zu irgendeinem Zeitpunkt entscheiden, dass der Job zu lange ausgeführt wurde, können Sie ihn einfach stoppen, indem Sie ihn an Stop-Job weiterleiten.

Get-Job -Name GetFileList |Stop-Job

Wenn Sie jedoch einen Job gestoppt haben, ist er immer noch verfügbar, unabhängig davon, welche Daten er bis zu dem Zeitpunkt erhalten hat, an dem Sie ihn gestoppt haben. Es gibt jedoch ein Problem. Wenn Sie in PowerShell die Ergebnisse für einen Job erhalten, werden sie gelöscht. Damit sie bestehen bleiben, müssen Sie den Keep-Switch-Parameter von Receive-Job angeben.

Get-Job -Name GetFileList |Receive-Job - Halten Sie

Wenn Sie mit einem Job fertig sind, sollten Sie ihn entfernen. Um den Job zu entfernen, leiten Sie ihn einfach an das Cmdlet Remove-Job.

Get-Job-Name GetFileList |Remove-Job

Dadurch wird es aus der Liste der Jobs entfernt, die von Get-Job zurückgegeben werden.

Remote-Jobs

Vor einiger Zeit haben wir uns angeschaut, wie wir mit Remoting PowerShell-Befehle auf einem Remote-Rechner mit Invoke-Command ausführen können, aber wussten Sie, dass Sie mit Invoke-Command einen Remoting-Job im Hintergrund starten können? Fügen Sie dazu den -AsJob-Parameter einfach am Ende des Befehls hinzu:

Invoke-Command -ComputerName Flash, Viper -Credential -Administrator -ScriptBlock{ gci} -AsJob

Das war ein einfacher Befehl und sollte nun abgeschlossen seinWerfen wir einen Blick auf unseren Jobstatus.

Hmm, sieht so aus als wäre es fehlgeschlagen. Das bringt mich auf meinen ersten Jobjob. Wenn Sie in PowerShell einen neuen Job eines beliebigen Typs erstellen, wird für jeden Computer, auf dem der Job ausgeführt wird, zusätzlich zu einem untergeordneten Job ein übergeordneter Job erstellt. Wenn Sie das Cmdlet Get-Job verwenden, werden nur die übergeordneten Jobs und die Statuseigenschaft das Worst-Case-Szenario angezeigt. Dies bedeutet, dass der Status des übergeordneten Jobs auch dann angezeigt wird, wenn der Befehl nur auf einem von hundert Computern ausgeführt wirdgescheitert. Um eine Liste der untergeordneten Jobs anzuzeigen, müssen Sie den Parameter IncludeChildJob verwenden.

Wenn Sie genauer hinsehen, werden Sie sehen, dass der Job tatsächlich nur auf einem Computer fehlschlug, was uns auf den nächsten Fehler bringt. Wenn Sie versuchen, die Ergebnisse für den Job abzurufen, und Sie den Jobnamen oder die ID des übergeordneten Jobs angeben, gibt PowerShell die Daten aller untergeordneten Jobs zurück. Das Problem ist, dass, wenn es einen Fehler in einem der untergeordneten Jobs gibt, wir mit etwas rotem Text belassen werden.

Es gibt zwei Möglichkeiten, dies zu umgehen. Wenn Sie zunächst wissen, für welche Computer die Ergebnisse angezeigt werden sollen, können Sie einfach den ComputerName-Parameter des Cmdlets Recieve -Job verwenden.

Get-Job-Id 3 |Receive-Job -Keep -ComputerName Viper

Alternativ können Sie die Ergebnisse eines bestimmten untergeordneten Jobs mit seiner Job-ID abrufen.

Get-Job-ID 3 -IncludeChildJob

Get-Job-ID 5 |Receive-Job-

WMI-Jobs anzeigen

WMI-Jobs entsprechen in etwa denen von Remote-Jobs, sodass nur der -AsJob-Parameter zum Cmdlet Get-WmiObject hinzugefügt werden muss.

Leider bedeutet dies, dass sie auch den gleichen Problemen unterliegen, die ich im Abschnitt "Remote-Jobs" erwähnt habe. Geplante

-Jobs

Die letzten drei Arten von Jobs, die wir untersucht haben, waren nicht persistent, was bedeutet, dass sie nur in Ihrer aktuellen Sitzung verfügbar sind. Das bedeutet im Wesentlichen, dass Sie keine Jobs sehen, wenn Sie einen Job starten und dann eine andere PowerShell-Konsole öffnen und Get-Job ausführen. Kehren Sie jedoch zu der Konsole zurück, von der Sie den Job gekickt haben, und Sie werden seinen Status sehen können. Dies steht im Gegensatz zu geplanten Jobs, bei denen persistent ist. Grundsätzlich ist ein geplanter Job ein Skriptblock, der nach einem Zeitplan ausgeführt wird. In der Vergangenheit konnte der gleiche Effekt mit dem Windows Task Scheduler erreicht werden, was wirklich unter der Haube passiert. Um einen neuen geplanten Job zu erstellen, machen wir folgendes:

Register-ScheduledJob -Name GetEventLogs -ScriptBlock{ Get-EventLog -LogName Sicherheit -Newste 100} -Trigger( New-JobTrigger -Täglich-um 17 Uhr) -ScheduledJobOption( New-ScheduledJobOption-RunElevated)

In diesem Befehl ist ziemlich viel los, also lasst uns das kaputt machen.

  • Zuerst geben wir unserem geplanten Job den Namen GetEventLogs.
  • Wir sagen dann, dass wir bei einer Auslösung den Inhalt des angegebenen Skriptblocks ausführen sollen, der im Grunde die neuesten 100 Einträge des Sicherheitsereignisprotokolls erhält.
  • Als nächstes spezifizieren wir einen Trigger. Da der Trigger-Parameter ein Trigger-Objekt als Eingabe verwendet, haben wir einen in Klammern gesetzten Befehl verwendet, um einen Trigger zu generieren, der jeden Tag um 17 Uhr ausgelöst wird.
  • Da es sich um das Ereignisprotokoll handelt, müssen wir als Administrator ausgeführt werden, den wir angeben können, indem wir ein neues ScheduledJobOption-Objekt erstellen und es an den Parameter ScheduledJobOption übergeben.

Da dies ein etwas anderer Jobtyp ist, müssen Sie auch einen anderen Befehl verwenden, um eine Liste aller geplanten Jobs auf einem Computer abzurufen.

Get-ScheduledJob

Das ist alles, was dazu gehört.