Ricerca…


introduzione

I lavori sono stati introdotti in PowerShell 2.0 e hanno contribuito a risolvere un problema inerente agli strumenti da riga di comando. In poche parole, se si avvia un'attività a lunga esecuzione, il prompt non è disponibile fino al termine dell'attività. Come esempio di un'attività a lunga esecuzione, pensa a questo semplice comando di PowerShell:

Get-ChildItem -Path c: \ -Recurse

Ci vorrà un po 'di tempo per recuperare l'elenco completo delle directory della tua unità C :. Se lo esegui come lavoro, la console riprenderà il controllo e in seguito potrai acquisire il risultato.

Osservazioni

I lavori di PowerShell vengono eseguiti in un nuovo processo. Questo ha pro e contro che sono correlati.

Professionisti:

  1. Il lavoro viene eseguito in un processo pulito, incluso l'ambiente.
  2. Il lavoro può essere eseguito in modo asincrono per il processo PowerShell principale

Contro:

  1. Le modifiche dell'ambiente di processo non saranno presenti nel lavoro.
  2. I parametri passano e i risultati restituiti sono serializzati.
    • Ciò significa che se si modifica un oggetto parametro mentre il lavoro è in esecuzione, ciò non si rifletterà nel lavoro.
    • Ciò significa anche che se un oggetto non può essere serializzato non è possibile passarlo o restituirlo (sebbene PowerShell possa copiare qualsiasi parametro e passare / restituire un oggetto PSObject).

Creazione di lavoro di base

Avviare un blocco di script come processo in background:

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

Avvia uno script come processo in background:

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

Avvia un lavoro utilizzando Invoke-Command su una macchina remota:

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

Avvia lavoro come utente diverso (richiede password):

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

O

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

Avvia lavoro come utente diverso (Nessun prompt):

$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

Gestione del lavoro di base

Ottieni un elenco di tutti i lavori nella sessione corrente:

Get-Job

In attesa di un lavoro da terminare prima di ottenere il risultato:

$job | Wait-job | Receive-Job 

Timeout di un lavoro se viene eseguito troppo a lungo (10 secondi in questo esempio)

$job | Wait-job -Timeout 10

Arresto di un lavoro (completa tutte le attività che sono in sospeso in quella coda di lavoro prima di terminare):

$job | Stop-Job 

Rimuovi il lavoro dall'elenco dei lavori in background della sessione corrente:

$job | Remove-Job

Nota : quanto segue funzionerà solo sui lavori del Workflow lavoro.

Sospendi un processo di Workflow lavoro (Pausa):

$job | Suspend-Job 

Riprendi un processo di Workflow lavoro:

$job | Resume-Job 


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow