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