PowerShell
PowerShell-Hintergrundjobs
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:
- Der Job wird in einem sauberen Prozess ausgeführt, einschließlich Umgebung.
- Der Job kann asynchron zu Ihrem PowerShell-Hauptprozess ausgeführt werden
Nachteile:
- Änderungen in der Prozessumgebung sind im Job nicht vorhanden.
- 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