Geek School: Erlernen der Verwendung von Jobs in PowerShell

Inhaltsverzeichnis:

Geek School: Erlernen der Verwendung von Jobs in PowerShell - Blog 2023
Geek School: Erlernen der Verwendung von Jobs in PowerShell - Blog 2023
Anonim
PowerShell verfügt über vier Arten von Jobs: Hintergrundjobs, Remotejobs, WMI-Jobs und geplante Jobs. Begleiten Sie uns, um herauszufinden, was sie sind und wie wir sie einsetzen können.
PowerShell verfügt über vier Arten von Jobs: Hintergrundjobs, Remotejobs, WMI-Jobs und geplante Jobs. Begleiten Sie uns, um herauszufinden, was sie sind und wie wir sie einsetzen können.

Lesen Sie unbedingt die vorherigen Artikel der Serie:

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

Und bleiben Sie die ganze Woche für den Rest der Serie dran.

Hintergrund-Jobs

Bisher war alles, was ich Ihnen in PowerShell gezeigt habe, synchron, was bedeutet, dass wir etwas in die Shell eingeben und erst dann wirklich viel tun können, wenn der Befehl ausgeführt wurde. Hier kommen Hintergrundjobs ins Spiel. Um einen Hintergrund zu starten, übergeben Sie einfach einen Skriptblock an das Cmdlet Start-Job.

Start-Job –Name GetFileList –Scriptblock {Get-ChildItem C: –Recurse}

Jetzt können wir innerhalb der Shell alles tun, was wir wollen, während der Skriptblock im Hintergrund ausgeführt wird.
Jetzt können wir innerhalb der Shell alles tun, was wir wollen, während der 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.
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. In dem obigen Screenshot können wir beispielsweise sehen, dass wir einen Hintergrundjob namens GetFileList haben, der noch läuft, aber bereits Daten zurückgibt. Wenn Sie zu einem bestimmten Zeitpunkt feststellen, dass der Job zu lange ausgeführt wurde, können Sie ihn leicht stoppen, indem Sie ihn an Stop-Job weiterleiten.
Die Jobobjekte informieren Sie über den Status der Jobs. In dem obigen Screenshot können wir beispielsweise sehen, dass wir einen Hintergrundjob namens GetFileList haben, der noch läuft, aber bereits Daten zurückgibt. Wenn Sie zu einem bestimmten Zeitpunkt feststellen, dass der Job zu lange ausgeführt wurde, können Sie ihn leicht stoppen, indem Sie ihn an Stop-Job weiterleiten.

Get-Job –Name GetFileList | Stop-Job

Sobald Sie einen Job jedoch gestoppt haben, sind alle erhaltenen Daten bis zu dem Punkt, an dem Sie ihn angehalten haben, noch verfügbar. Es gibt jedoch ein Problem. Wenn Sie in PowerShell die Ergebnisse für einen Job erhalten, werden diese gelöscht. Damit sie erhalten bleiben, müssen Sie den Keep-Switch-Parameter von Receive – Job angeben.
Sobald Sie einen Job jedoch gestoppt haben, sind alle erhaltenen Daten bis zu dem Punkt, an dem Sie ihn angehalten haben, noch verfügbar. Es gibt jedoch ein Problem. Wenn Sie in PowerShell die Ergebnisse für einen Job erhalten, werden diese gelöscht. Damit sie erhalten bleiben, müssen Sie den Keep-Switch-Parameter von Receive – Job angeben.

Get-Job –Name GetFileList | Receive-Job –Keep

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

Get-Job –Name GetFileList | Remove-Job

Dadurch wird es aus der Liste der von Get-Job zurückgegebenen Jobs entfernt.

Image
Image

Remote-Jobs

Vor ein paar Lektionen haben wir uns angesehen, wie wir mithilfe von Invoke-Command mithilfe von Remoting PowerShell-Befehle auf einer Remote-Maschine ausführen können. Wussten Sie jedoch, dass Sie mit Invoke-Command auch einen Remoting-Job im Hintergrund starten können? Fügen Sie dazu einfach den Parameter –AsJob am Ende Ihres Befehls hinzu:

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

Dies war ein einfacher Befehl und sollte inzwischen abgeschlossen sein, also werfen wir einen Blick auf unseren Jobstatus.
Dies war ein einfacher Befehl und sollte inzwischen abgeschlossen sein, also werfen wir einen Blick auf unseren Jobstatus.
Hmm, sieht aus wie es gescheitert ist. Das bringt mich zu meinem ersten Job mit Jobs. Wenn Sie in PowerShell einen neuen Job eines beliebigen Typs erstellen, wird für jeden Computer, für den Sie den Job ausführen, zusätzlich zu einem untergeordneten Job ein übergeordneter Job erstellt. Wenn Sie das Cmdlet "Get-Job" verwenden, werden nur die übergeordneten Jobs angezeigt. Die State-Eigenschaft ist ein Worst-Case-Szenario. Das heißt, auch wenn der Befehl nur auf einem von hundert Computern ausgeführt werden konnte, wird der Status des übergeordneten Jobs angezeigt gescheitert. Um eine Liste untergeordneter Jobs anzuzeigen, müssen Sie den Parameter IncludeChildJob verwenden.
Hmm, sieht aus wie es gescheitert ist. Das bringt mich zu meinem ersten Job mit Jobs. Wenn Sie in PowerShell einen neuen Job eines beliebigen Typs erstellen, wird für jeden Computer, für den Sie den Job ausführen, zusätzlich zu einem untergeordneten Job ein übergeordneter Job erstellt. Wenn Sie das Cmdlet "Get-Job" verwenden, werden nur die übergeordneten Jobs angezeigt. Die State-Eigenschaft ist ein Worst-Case-Szenario. Das heißt, auch wenn der Befehl nur auf einem von hundert Computern ausgeführt werden konnte, wird der Status des übergeordneten Jobs angezeigt gescheitert. Um eine Liste untergeordneter Jobs anzuzeigen, müssen Sie den Parameter IncludeChildJob verwenden.
Wenn Sie genauer hinschauen, werden Sie feststellen, dass der Job tatsächlich nur auf einem Computer fehlgeschlagen ist, was uns zum nächsten Problem führt. Wenn Sie versuchen, die Ergebnisse für den Job abzurufen und den Jobnamen oder die ID des übergeordneten Objekts anzugeben, gibt PowerShell die Daten aller untergeordneten Jobs zurück. Das Problem ist, dass bei einem Fehler in einem der untergeordneten Jobs ein roter Text übrig bleibt.
Wenn Sie genauer hinschauen, werden Sie feststellen, dass der Job tatsächlich nur auf einem Computer fehlgeschlagen ist, was uns zum nächsten Problem führt. Wenn Sie versuchen, die Ergebnisse für den Job abzurufen und den Jobnamen oder die ID des übergeordneten Objekts anzugeben, gibt PowerShell die Daten aller untergeordneten Jobs zurück. Das Problem ist, dass bei einem Fehler in einem der untergeordneten Jobs ein roter Text übrig bleibt.
Image
Image

Es gibt zwei Möglichkeiten, dies zu umgehen. Wenn Sie wissen, für welche Computer Sie die Ergebnisse wünschen, können Sie einfach den Parameter ComputerName des Cmdlets Recieve –Job verwenden.

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

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

Get-Job -Id 3 –IncludeChildJob

Image
Image

Get-Job -Id 5 | Receive-Job –Keep

Image
Image

WMI-Jobs

WMI-Jobs sind im Wesentlichen mit Remote-Jobs identisch, sodass nur der Parameter -AsJob zum Cmdlet Get-WmiObject hinzugefügt werden muss.

Image
Image
Leider bedeutet dies, dass sie auch denselben gotchas unterliegen, die ich im Abschnitt Remote Jobs erwähnt habe.
Leider bedeutet dies, dass sie auch denselben gotchas unterliegen, die ich im Abschnitt Remote Jobs erwähnt habe.

Geplante Jobs

Die letzten drei Arten von Jobs, die wir uns angesehen haben, waren nicht dauerhaft, dh sie sind nur in Ihrer aktuellen Sitzung verfügbar. Im Allgemeinen bedeutet dies, dass Sie keine Jobs sehen, wenn Sie einen Job starten, eine andere PowerShell Console öffnen und Get-Job ausführen. Wenn Sie jedoch zu der Konsole zurückkehren, von der aus Sie den Job gestartet haben, können Sie den Status sehen. Dies steht im Gegensatz zu geplanten Jobs sind hartnäckig. Grundsätzlich ist ein geplanter Job ein Skriptblock, der nach einem Zeitplan ausgeführt wird. In der Vergangenheit hätte derselbe Effekt mit dem Windows Task Scheduler erzielt werden können, was wirklich unter der Haube geschieht. Um einen neuen geplanten Job zu erstellen, führen wir folgende Schritte aus:

Register-ScheduledJob -Name GetEventLogs -ScriptBlock {Get-EventLog -LogName Security -Newest 100} -Trigger (New-JobTrigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)

In diesem Befehl ist ziemlich viel los, also brechen wir ihn auf.

  • Zuerst geben wir unserem Scheduled Job den Namen GetEventLogs.
  • Wir sagen dann, dass wir bei einer Auslösung den Inhalt des angegebenen Skriptblocks ausführen sollen, der im Wesentlichen die neuesten 100 Einträge des Sicherheitsereignisprotokolls abruft.
  • Als Nächstes geben wir einen Auslöser an. Da für den Triggerparameter ein Triggerobjekt als Eingabe verwendet wird, wurde mit einem Befehl in Klammern ein Trigger generiert, der jeden Tag um 17.00 Uhr ausgelöst wird.
  • Da es sich um das Ereignisprotokoll handelt, müssen wir als Administrator ausgeführt werden. Dies kann durch Erstellen eines neuen ScheduledJobOption-Objekts und Übergabe an den Parameter ScheduledJobOption festgelegt werden.
Da es sich um einen etwas anderen Jobtyp handelt, müssen Sie auch einen anderen Befehl verwenden, um eine Liste aller auf einem Computer geplanten Jobs abzurufen.
Da es sich um einen etwas anderen Jobtyp handelt, müssen Sie auch einen anderen Befehl verwenden, um eine Liste aller auf einem Computer geplanten Jobs abzurufen.

Get-ScheduledJob

Das ist alles dazu.
Das ist alles dazu.

Beliebtes Thema

Fachberatung