Suche…


Einführung

Jobs wurden in PowerShell 2.0 eingeführt und trugen dazu bei, ein Problem der Befehlszeilentools zu lösen. Kurz gesagt, wenn Sie eine lange laufende Aufgabe starten, ist Ihre Aufforderung erst verfügbar, wenn die Aufgabe abgeschlossen ist. Als Beispiel für eine lange laufende Aufgabe sollten Sie sich diesen einfachen PowerShell-Befehl vorstellen:

Get-ChildItem -Pfad c: \ -Recurse

Es dauert eine Weile, bis die vollständige Verzeichnisliste Ihres Laufwerks C: abgerufen wird. Wenn Sie es als Job ausführen, erhält die Konsole die Kontrolle zurück und Sie können das Ergebnis später erfassen.

Bemerkungen

PowerShell-Jobs werden in einem neuen Prozess ausgeführt. Dies hat Vor- und Nachteile, die miteinander verbunden sind.

Pros:

  1. Der Job wird in einem sauberen Prozess ausgeführt, einschließlich Umgebung.
  2. Der Job kann asynchron zu Ihrem PowerShell-Hauptprozess ausgeführt werden

Nachteile:

  1. Änderungen in der Prozessumgebung sind im Job nicht vorhanden.
  2. Parameterübergabe an und zurückgegebene Ergebnisse werden serialisiert.
    • Das heißt, wenn Sie ein Parameterobjekt ändern, während der Job ausgeführt wird, wird es nicht im Job angezeigt.
    • Dies bedeutet auch, wenn ein Objekt nicht serialisiert werden kann, können Sie es nicht übergeben oder zurückgeben (obwohl PowerShell Parameter kopieren und ein PSObject übergeben / übergeben kann.)

Grundlegende Schaffung von Arbeitsplätzen

Starten Sie einen Scriptblock als Hintergrundjob:

$job = Start-Job -ScriptBlock {Get-Process}

Starten Sie ein Skript als Hintergrundjob:

$job = Start-Job -FilePath "C:\YourFolder\Script.ps1"

Starten Sie einen Job mit Invoke-Command auf einem Remote-Computer:

$job = Invoke-Command -ComputerName "ComputerName" -ScriptBlock {Get-Service winrm} -JobName "WinRM" -ThrottleLimit 16 -AsJob

Job als anderer Benutzer starten (Aufforderung zur Eingabe eines Passworts):

Start-Job -ScriptBlock {Get-Process} -Credential "Domain\Username"

Oder

Start-Job -ScriptBlock {Get-Process} -Credential (Get-Credential)

Job als anderer Benutzer starten (Keine Eingabeaufforderung):

$username = "Domain\Username" 
$password = "password"
$secPassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential -ArgumentList @($username, $secPassword)
Start-Job -ScriptBlock {Get-Process} -Credential $credentials

Grundlegende Jobverwaltung

Rufen Sie eine Liste aller Jobs in der aktuellen Sitzung ab:

Get-Job

Warten auf einen Job, um den Vorgang abzuschließen, bevor Sie das Ergebnis erhalten:

$job | Wait-job | Receive-Job 

Timeout eines Jobs, wenn er zu lang ist (in diesem Beispiel 10 Sekunden)

$job | Wait-job -Timeout 10

Job anhalten (erledigt alle Aufgaben, die vor dem Beenden in der Jobwarteschlange anstehen)

$job | Stop-Job 

Job aus der Hintergrund-Jobliste der aktuellen Sitzung entfernen:

$job | Remove-Job

Hinweis : Folgendes funktioniert nur bei Workflow Jobs.

Einen Workflow Job Workflow (Pause):

$job | Suspend-Job 

Einen Workflow Job wieder aufnehmen:

$job | Resume-Job 


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow