Buscar..


Introducción

Los trabajos se introdujeron en PowerShell 2.0 y ayudaron a resolver un problema inherente en las herramientas de línea de comandos. En pocas palabras, si inicia una tarea de ejecución prolongada, su indicador no estará disponible hasta que la tarea finalice. Como ejemplo de una tarea de larga ejecución, piense en este simple comando de PowerShell:

Get-ChildItem -Path c: \ -Recurse

Tomará un tiempo recuperar la lista completa de directorios de su unidad C :. Si lo ejecuta como trabajo, la consola recuperará el control y podrá capturar el resultado más adelante.

Observaciones

PowerShell Jobs se ejecuta en un nuevo proceso. Esto tiene pros y contras que están relacionados.

Pros:

  1. El trabajo se ejecuta en un proceso limpio, incluido el entorno.
  2. El trabajo puede ejecutarse de forma asíncrona a su proceso principal de PowerShell

Contras:

  1. Los cambios en el entorno del proceso no estarán presentes en el trabajo.
  2. Los parámetros que pasan y los resultados devueltos se serializan.
    • Esto significa que si cambia un objeto de parámetro mientras el trabajo se está ejecutando, no se reflejará en el trabajo.
    • Esto también significa que si un objeto no puede ser serializado, no puede pasarlo o devolverlo (aunque PowerShell puede copiar cualquier parámetro y pasar / devolver un PSObject).

Creación de empleo básico

Iniciar un bloque de script como trabajo de fondo:

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

Iniciar una secuencia de comandos como trabajo de fondo:

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

Comience un trabajo utilizando Invoke-Command en una máquina remota:

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

Iniciar trabajo como un usuario diferente (Solicita contraseña):

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

O

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

Iniciar trabajo como un usuario diferente (No se solicita):

$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

Gestión de trabajos básicos

Obtenga una lista de todos los trabajos en la sesión actual:

Get-Job

Esperando un trabajo para terminar antes de obtener el resultado:

$job | Wait-job | Receive-Job 

Tiempo de espera de un trabajo si se ejecuta demasiado tiempo (10 segundos en este ejemplo)

$job | Wait-job -Timeout 10

Detener un trabajo (completa todas las tareas que están pendientes en esa cola de trabajos antes de finalizar):

$job | Stop-Job 

Eliminar trabajo de la lista de trabajos en segundo plano de la sesión actual:

$job | Remove-Job

Nota : lo siguiente solo funcionará en trabajos de Workflow trabajo.

Suspender un Workflow trabajo (pausa):

$job | Suspend-Job 

Reanudar un Workflow trabajo:

$job | Resume-Job 


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow