PowerShell
Lavori in background di PowerShell
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:
- Il lavoro viene eseguito in un processo pulito, incluso l'ambiente.
- Il lavoro può essere eseguito in modo asincrono per il processo PowerShell principale
Contro:
- Le modifiche dell'ambiente di processo non saranno presenti nel lavoro.
- 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