TEMA
about_Jobs
DESCRIPCIÓN BREVE
Proporciona información sobre cómo los trabajos de segundo plano
de Windows PowerShell ejecutan un comando o expresión en segundo
plano sin interactuar con la sesión actual.
DESCRIPCIÓN DETALLADA
En este tema se explica cómo ejecutar los trabajos de segundo
plano en Windows PowerShell en un equipo local. Para obtener más
información sobre cómo se ejecutan los trabajos de segundo plano
en equipos remotos, vea about_Remote_Jobs.
Cuando se inicia un trabajo de segundo plano, el símbolo del
sistema vuelve inmediatamente, aunque el trabajo tarde un tiempo
prolongado en completarse. Puede continuar trabajando en la sesión sin
interrupción mientras el trabajo se ejecuta.
Importante: los trabajos de segundo plano que se inician mediante
Start-Job o el parámetro AsJob de Invoke-Command se basan en la
infraestructura de comunicación remota de Windows PowerShell. Para
usar estas características, Windows PowerShell debe estar configurado
para la comunicación remota, aunque el trabajo de segundo plano
se ejecute solamente en el equipo local. Para obtener más información,
vea about_Remote_Requirements.
CÓMO INICIAR UN TRABAJO EN EL EQUIPO LOCAL
Para iniciar un trabajo de segundo plano en un equipo local, se
utiliza el cmdlet Start-Job.
Para escribir un comando Start-Job, el comando que el trabajo
ejecuta debe ir entre llaves ( { } ). Use el parámetro
ScriptBlock para especificar el comando.
El comando siguiente inicia un trabajo de segundo plano que
ejecuta un comando Get-Process en el equipo local.
start-job -scriptblock {get-process}
El comando Start-Job devuelve un objeto que representa el
trabajo. El objeto de trabajo contiene información útil sobre el
trabajo, pero no contiene los resultados del mismo.
Guarde el objeto de trabajo en una variable y, a continuación,
utilícelo con los demás cmdlets Job administrar el trabajo de
segundo plano. El comando siguiente inicia un objeto de trabajo y
guarda el objeto de trabajo resultante en la variable $job.
$job = start-job -scriptblock {get-process}
También se puede utilizar el cmdlet Get-Job para obtener objetos que
representan los trabajos iniciado en la sesión actual. Get-Job
devuelve el mismo objeto de trabajo que Start-Job.
OBTENER OBJETOS DE TRABAJO
Para obtener objetos que representan los trabajos de segundo
plano que se han iniciado en la sesión actual, se utiliza el
cmdlet Get-Job. Sin parámetros, Get-Job devuelve todos los
trabajos que se han iniciado en la sesión actual.
Por ejemplo, el comando siguiente obtiene los trabajos de la
sesión actual.
get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost get-process
También se puede guardar el objeto de trabajo en una variable y
utilizarlo para representar el trabajo en un comando posterior.
El comando siguiente obtiene el trabajo cuyo identificador es 1 y
lo guarda en la variable $job.
$job = get-job -id 1
El objeto de trabajo contiene el estado del trabajo, que indica
si el trabajo ha finalizado. Un trabajo finalizado tiene el
estado "Complete" o "Failed". Un trabajo también puede estar bloqueado
(Blocked) o en ejecución (Running).
get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process
OBTENER LOS RESULTADOS DE UN TRABAJO
Cuando se ejecuta un trabajo de segundo plano, los resultados no
aparecen inmediatamente. En lugar de ello, el cmdlet Start-Job
devuelve un objeto de trabajo que representa el trabajo, pero no
contiene sus resultados. Para obtener los resultados de un
trabajo de segundo plano, se usa el cmdlet Receive-Job.
El comando siguiente utiliza el cmdlet Receive-Job para obtener
los resultados del trabajo. Utiliza 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 se pueden guardar los resultados de un trabajo en una
variable. El comando siguiente guarda en la variable $results
los resultados del trabajo contenido en la variable $job.
$results = receive-job -job $job
Además, los resultados del trabajo se pueden guardar en un archivo mediante
el operador de redirección (>) o el cmdlet Out-File. El comando siguiente
utiliza el operador de redirección para guardar en el archivo Results.txt
los resultados del trabajo contenido en la variable $job.
receive-job -job $job > results.txt
OBTENER Y MANTENER RESULTADOS PARCIALES DE UN TRABAJO
El cmdlet Receive-Job devuelve los resultados de un trabajo de
segundo plano. Si el trabajo se ha completado, Receive-Job
devuelve los resultados completos del trabajo. Si el trabajo
todavía se está ejecutando, Receive-Job obtiene los resultados
que se han generado hasta ahora. Los comandos Receive-Job se
pueden ejecutar de nuevo para obtener los resultados restantes.
Cuando Receive-Job devuelve resultados, elimina de forma
predeterminada los resultados de la memoria caché donde se
almacenan los resultados de los trabajos. Si se ejecuta otro
comando Receive-Job, solamente se obtienen los resultados que no
se hayan recibido todavía.
Los comandos siguientes muestran los resultados de comandos
Receive-Job ejecutados antes de que el trabajo se haya completado.
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 que Receive-Job elimine los resultados que ha
devuelto de un trabajo, se utiliza el parámetro Keep. Así, Receive-Job
devolverá todos los resultados generados hasta ese momento.
Los comandos siguientes muestran el efecto de utilizar el
parámetro Keep en un trabajo que no se ha completado todavía.
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
ESPERAR A LOS RESULTADOS
Si se ejecuta un comando que tarda mucho tiempo en completarse,
se pueden utilizar las propiedades del objeto de trabajo para
determinar cuándo se completa el trabajo. El comando siguiente
utiliza el objeto Get-Job para obtener todos los trabajos de
segundo plano de la sesión actual.
get-job
Los resultados aparecen en una tabla. El estado del trabajo
aparece en la columna State.
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process
2 Job2 Running True localhost get-eventlog -log syst...
3 Job3 Complete True localhost dir -path c:\* -recurse
En este caso, la propiedad State revela que el trabajo 2 sigue
ejecutándose. Si se usara el cmdlet Receive-Job ahora para obtener los
resultados del trabajo, estarían incompletos. El cmdlet Receive-Job
se puede usar repetidamente para obtener todos los resultados.
De forma predeterminada, cada vez que se utiliza, se obtienen solamente los
resultados que todavía no se han recibido; sin embargo, es posible
utilizar el parámetro Keep del cmdlet Receive-Job para conservar los
resultados aunque ya se hayan recibido.
En este punto, se pueden escribir los resultados en un archivo y, a
continuación, anexarle los resultados nuevos a medida que se reciban.
También se puede esperar y comprobar el estado del trabajo más adelante.
Otra opción es utilizar el cmdlet Wait-Job para esperar a alguno
o todos los resultados del trabajo. Wait-Job permite esperar a que se
completen todos los trabajos, uno determinado o cualquiera de ellos.
El comando siguiente utiliza el cmdlet Wait-Job para esperar al
trabajo cuyo identificador es 10.
wait-job -ID 10
En consecuencia, el símbolo del sistema de Windows PowerShell se
suprime hasta que el trabajo se completa.
También se puede esperar durante un período de tiempo
predeterminado. Este comando utiliza el parámetro Timeout para
limitar la espera a 120 segundos. Cuando ha transcurrido ese
tiempo, vuelve a mostrarse el símbolo del sistema, pero el
trabajo continúa ejecutándose en segundo plano.
wait-job -ID 10 -timeout 120
DETENER UN TRABAJO
Para detener un trabajo de segundo plano, se utiliza el cmdlet
Stop-Job. El comando siguiente inicia un trabajo para obtener
todas las entradas del registro de eventos del sistema. Guarda el
objeto de trabajo en la variable $job.
$job = start-job -scriptblock {get-eventlog -log system}
El comando siguiente detiene el trabajo. Utiliza un operador de
canalización (|) para enviar el trabajo contenido en la variable
$job a Stop-Job.
$job | stop-job
ELIMINAR UN TRABAJO
Para eliminar un trabajo de segundo plano, se utiliza el cmdlet
Remove-Job. El comando siguiente elimina el objeto de trabajo
contenido en la variable $job.
remove-job -job $job
INVESTIGAR UN TRABAJO QUE PRODUJO UN ERROR
Para averiguar por qué se produjo un error en un trabajo, se
utiliza 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\MiEmpresa}
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Failed False localhost new-item -path HKLM:\S...
El comando siguiente utiliza la propiedad Reason para buscar el
error que ha provocado el error en el trabajo.
$job.ChildJobs[0].JobStateInfo.Reason
En este caso, el error en el trabajo se ha producido porque
equipo remoto exigía credenciales explícitas para ejecutar el
comando. El valor de la propiedad Reason es:
Error de conexión al servidor remoto. Mensaje de error:
Acceso denegado.
CMDLETS JOB
Start-Job Inicia un trabajo de segundo plano en un equipo local.
Get-Job Obtiene todos los trabajos de segundo plano que se han
iniciado en la sesión actual.
Receive-Job Obtiene los resultados de los trabajos de segundo plano.
Stop-Job Detiene un trabajo de segundo plano.
Wait-Job Suprime el símbolo del sistema hasta que uno o todos
los trabajos se han completado.
Remove-Job Elimina un trabajo de segundo plano.
Invoke-Command El parámetro AsJob ejecuta cualquier comando como un trabajo
de segundo plano en un equipo remoto. También se puede
utilizar Invoke-Command para ejecutar cualquier comando Job
remotamente, incluso un comando Start-Job.
VEA TAMBIÉN
about_Remote_Jobs
about_Job_Details
about_Remote
about_PSSessions
Start-Job
Get-Job
Receive-Job
Stop-Job
Wait-Job
Remove-Job
Invoke-Command