Acerca de los trabajos
DESCRIPCIÓN BREVE
Proporciona información sobre cómo los trabajos en segundo plano de PowerShell ejecutan un comando o expresión en segundo plano sin interactuar con la sesión actual.
DESCRIPCIÓN LARGA
En este tema se explica cómo ejecutar trabajos en segundo plano en PowerShell en un equipo local. Para obtener información sobre cómo ejecutar trabajos en segundo plano en equipos remotos, consulte about_Remote_Jobs.
Cuando se inicia un trabajo en segundo plano, el símbolo del sistema se devuelve inmediatamente, incluso si el trabajo tarda un tiempo prolongado en completarse. Puede seguir trabajando en la sesión sin interrupción mientras se ejecuta el trabajo.
CMDLETS DE TRABAJO
Cmdlet | Descripción |
---|---|
Start-Job |
Inicia un trabajo en segundo plano en un equipo local. |
Get-Job |
Obtiene los trabajos en segundo plano que se iniciaron en . |
sesión actual. | |
Receive-Job |
Obtiene los resultados de los trabajos en segundo plano. |
Stop-Job |
Detiene un trabajo en segundo plano. |
Wait-Job |
Suprime el símbolo del sistema hasta que uno o todos los trabajos sean |
íntegro. | |
Remove-Job |
Elimina un trabajo en segundo plano. |
Invoke-Command |
El parámetro AsJob ejecuta cualquier comando como fondo |
trabajo en un equipo remoto. También puede usar | |
Invoke-Command para ejecutar cualquier comando de trabajo de forma remota, |
|
incluido un comando Start-Job. |
CÓMO INICIAR UN TRABAJO EN EL EQUIPO LOCAL
Para iniciar un trabajo en segundo plano en el equipo local, use el cmdlet Start-Job.
Para escribir un comando Start-Job, incluya el comando que el trabajo ejecuta entre llaves ( { } ). Use el parámetro ScriptBlock para especificar el comando .
El comando siguiente inicia un trabajo en segundo plano que ejecuta un Get-Process
comando en el equipo local.
Start-Job -ScriptBlock {Get-Process}
El Start-Job
comando devuelve un objeto que representa el trabajo. El objeto de trabajo contiene información útil sobre el trabajo, pero no contiene los resultados del trabajo.
Guarde el objeto de trabajo en una variable y úselo con los otros cmdlets job para administrar el trabajo en segundo plano. El siguiente comando inicia un objeto de trabajo y guarda el objeto de trabajo resultante en la variable $job.
$job = Start-Job -ScriptBlock {Get-Process}
También puede usar el Get-Job
cmdlet para obtener objetos que representan los trabajos iniciados en la sesión actual. Get-Job
devuelve el mismo objeto de trabajo que Start-Job devuelve.
OBTENCIÓN DE OBJETOS DE TRABAJO
Para obtener el objeto que representa los trabajos en segundo plano que se iniciaron en la sesión actual, use el Get-Job
cmdlet . Sin parámetros, Get-Job
devuelve todos los trabajos que se iniciaron en la sesión actual.
Por ejemplo, el siguiente comando obtiene los trabajos de la sesión actual.
PS C:> Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process
También puede guardar el objeto de trabajo en una variable y usarlo para representar el trabajo en un comando posterior. El siguiente comando obtiene el trabajo con el identificador 1 y lo guarda en la variable $job.
$job = Get-Job -Id 1
El objeto job contiene el estado del trabajo, que indica si el trabajo ha finalizado. Un trabajo terminado tiene el estado "Completado" o "Error". Un trabajo también puede bloquearse o ejecutarse.
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
OBTENER LOS RESULTADOS DE UN TRABAJO
Al ejecutar un trabajo en segundo plano, los resultados no aparecen inmediatamente.
En su lugar, el cmdlet Start-Job devuelve un objeto de trabajo que representa el trabajo, pero no contiene los resultados. Para obtener los resultados de un trabajo en segundo plano, use el Receive-Job
cmdlet .
El siguiente comando usa el Receive-Job
cmdlet para obtener los resultados del trabajo. Usa un objeto de trabajo guardado en la variable $job para identificar el trabajo.
Receive-Job -Job $job
El cmdlet Receive-Job devuelve los resultados del trabajo.
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
668 7 2672 6168 104 32.26 488 csrss
# ...
También puede guardar los resultados de un trabajo en una variable. El comando siguiente guarda los resultados del trabajo en la variable $job en la variable $results.
$results = Receive-Job -Job $job
Además, puede guardar los resultados del trabajo en un archivo mediante el operador de redirección (>) o el cmdlet Out-File. El siguiente comando usa el operador de redirección para guardar los resultados del trabajo en la variable $job en el archivo Results.txt.
Receive-Job -Job $job > results.txt
OBTENCIÓN Y MANTENIMIENTO DE RESULTADOS PARCIALES DEL TRABAJO
El cmdlet Receive-Job obtiene los resultados de un trabajo en segundo plano. Si se completa el trabajo, Receive-Job
obtiene todos los resultados del trabajo. Si el trabajo sigue en ejecución, Receive-Job obtiene los resultados que se han generado hasta ahora.
Puede volver a ejecutar Receive-Job
comandos para obtener los resultados restantes.
Cuando Receive-Job
devuelve resultados, de forma predeterminada, elimina esos resultados de la memoria caché donde se almacenan los resultados del trabajo. Si ejecuta otro Receive-Job
comando, solo obtendrá los resultados que aún no se han recibido.
Los siguientes comandos muestran los resultados de los comandos que se ejecutan antes de Receive-Job
que se complete el trabajo.
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
Para evitar Receive-Job
eliminar los resultados del trabajo que ha devuelto, use el parámetro Keep . Como resultado, Receive-Job
devuelve todos los resultados que se han generado hasta ese momento.
Los siguientes comandos muestran el efecto de usar el parámetro Keep en un trabajo que aún no se ha completado.
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
ESPERANDO LOS RESULTADOS
Si ejecuta un comando que tarda mucho tiempo en completarse, puede usar las propiedades del objeto de trabajo para determinar cuándo se completa el trabajo. El comando siguiente usa el Get-Job
objeto para obtener todos los trabajos en segundo plano de la sesión actual.
Get-Job
Los resultados aparecen en una tabla. El estado del trabajo aparece en la columna Estado.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
En este caso, la propiedad State revela que el trabajo 2 todavía se está ejecutando. Si usara el Receive-Job
cmdlet para obtener los resultados del trabajo ahora, los resultados estarían incompletos. Puede usar el Receive-Job
cmdlet repetidamente para obtener todos los resultados. De forma predeterminada, cada vez que se usa, solo se obtienen los resultados que aún no se han recibido, pero puede usar el parámetro Keep del cmdlet Receive-Job para conservar los resultados, aunque ya se hayan recibido.
Puede escribir los resultados parciales en un archivo y, a continuación, anexar resultados más recientes a medida que llegan o puede esperar y comprobar el estado del trabajo más adelante.
Puede usar el parámetro Wait del Receive-Job
cmdlet , que no devuelve el símbolo del sistema hasta que se complete el trabajo y todos los resultados estén disponibles.
También puede usar el Wait-Job
cmdlet para esperar a cualquiera o todos los resultados del trabajo. Wait-Job
permite esperar a que se complete un trabajo determinado, todos los trabajos o cualquiera de los trabajos.
El siguiente comando usa el cmdlet Wait-Job para esperar un trabajo con el identificador 10.
Wait-Job -ID 10
Como resultado, el símbolo del sistema de PowerShell se suprime hasta que se completa el trabajo.
También puede esperar un período predeterminado de tiempo. Este comando usa el parámetro Timeout para limitar la espera a 120 segundos. Cuando expira el tiempo, el símbolo del sistema devuelve, pero el trabajo continúa ejecutándose en segundo plano.
Wait-Job -ID 10 -Timeout 120
DETENER UN TRABAJO
Para detener un trabajo en segundo plano, use el Stop-Job
cmdlet . El siguiente comando inicia un trabajo para obtener cada entrada en el registro de eventos del sistema. Guarda el objeto de trabajo en la variable $job.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
El siguiente comando detiene el trabajo. Usa un operador de canalización (|) para enviar el trabajo en la variable $job a Stop-Job
.
$job | Stop-Job
ELIMINACIÓN DE UN TRABAJO
Para eliminar un trabajo en segundo plano, use el Remove-Job
cmdlet . El siguiente comando elimina el trabajo en la variable $job.
Remove-Job -Job $job
INVESTIGACIÓN DE UN TRABAJO CON ERRORES
Para averiguar por qué se produjo un error en un trabajo, use la subpropiedad Reason del objeto de trabajo.
El comando siguiente inicia un trabajo sin las credenciales necesarias. Guarda el objeto de trabajo en la variable $job.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
El comando siguiente usa la propiedad Reason para encontrar el error que provocó un error en el trabajo.
$job.ChildJobs[0].JobStateInfo.Reason
En este caso, se produjo un error en el trabajo porque el equipo remoto requería credenciales explícitas para ejecutar el comando. El valor de la propiedad Reason es:
Error al conectarse al servidor remoto con el siguiente mensaje de error: Se deniega el acceso.