about_Jobs

Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

TEMA

about_Jobs

DESCRIPCIÓN BREVE

Proporciona información sobre cómo los trabajos en segundo plano de Windows PowerShell ejecutan un comando o una 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 Windows PowerShell en un equipo local. Para más información sobre cómo ejecutar trabajos en segundo plano en equipos remotos, consulte about_Remote_Jobs.

Cuando inicia un trabajo en segundo plano, se devuelve el símbolo del sistema inmediatamente, aunque el trabajo tarde mucho tiempo en completarse. Puede seguir trabajando en la sesión sin interrupción mientras se ejecuta el trabajo.

LOS CMDLETS JOB

Start-Job

Inicia un trabajo en segundo plano en un equipo local.

Get-Job

Obtiene los trabajos en segundo plano que se iniciaron en la 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 se completen uno o todos los trabajos.

Remove-Job

Elimina un trabajo en segundo plano.

Invoke-Command

El parámetro AsJob ejecuta cualquier comando como un trabajo en segundo plano en un equipo remoto. También puede usar Invoke-Command para ejecutar cualquier comando de trabajo de forma remota, incluso 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, escriba el comando que ejecuta el trabajo entre llaves ({}). Use el parámetro ScriptBlock para especificar el comando.

El siguiente comando inicia un trabajo en 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 trabajo.

Guarde el objeto de trabajo en una variable y, a continuación, úselo con otros cmdlets Job para administrar el trabajo en 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 puede usar el cmdlet Get-Job para obtener los objetos que representan los trabajos iniciados en la sesión actual. Get-Job devuelve el mismo objeto de trabajo que Start-Job.

OBTENCIÓN DE OBJETOS DE TRABAJOS

Para obtener el objeto que representa los trabajos en segundo plano que se iniciaron en la sesión actual, use el cmdlet Get-Job. Sin parámetros, Get-Job devuelve todos los trabajos que se iniciaron en la sesión actual.

Por ejemplo, el comando siguiente 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 usarla 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 de trabajo contiene el estado del trabajo, que indica si el trabajo ha finalizado. Un trabajo finalizado tiene un estado "Completo" o "Error". Un trabajo también puede estar bloqueado o en ejecución.

Get-Job


        Id  Name  PSJobTypeName State      HasMoreData  Location   Command
        --  ----  ------------- -----      -----------  --------   -------
        1   Job1  BackgroundJob Complete   True         localhost  Get-Process

OBTENCIÓN DE LOS RESULTADOS DE UN TRABAJO

Cuando ejecuta 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 cmdlet Receive-Job.

El comando siguiente usa el cmdlet Receive-Job para obtener los resultados del trabajo. Usa un objeto de trabajo guardado en la variable $job usa 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 siguiente comando guarda los resultados del trabajo de la variable $job en la variable $results.

$results = Receive-Job -Job $job

También puede guardar los resultados del trabajo en un archivo mediante el operador de redirección (>) o el cmdlet Out-File. El comando siguiente usa el operador de redirección para guardar los resultados del trabajo de la variable $job en el archivo Results.txt.

        Receive-Job -Job $job > results.txt

OBTENCIÓN Y CONSERVACIÓN DE RESULTADOS DE TRABAJOS PARCIALES

El cmdlet Receive-Job obtiene los resultados de un trabajo en segundo plano. Si el trabajo se completa, Receive-Job obtiene todos los resultados del trabajo. Si el trabajo se sigue ejecutando Receive-Job obtiene los resultados que se han generado hasta ese momento. Puede ejecutar comandos Receive-Job de nuevo para obtener los resultados restantes.

Cuando Receive-Job devuelve resultados, de forma predeterminada, elimina los resultados anteriores de la memoria caché donde se almacenan los resultados del trabajo. Si ejecuta otro comando Receive-Job, obtendrá solo los resultados que todavía no se han recibido.

Los siguientes comandos muestran que los resultados de los comandos Receive-Job ejecutados antes de la finalización del 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 que Receive-Job elimine 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 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 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 objeto Get-Job para obtener todos los trabajos en segundo plano en 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 Syst...
        3   Job3  BackgroundJob Complete    True         localhost  dir -Path C:\* -Recurse

En este caso, la propiedad State revela que trabajo 2 sigue en ejecución. Si usase el cmdlet Receive-Job para obtener los resultados del trabajo ahora, el resultado sería incompleto. Puede usar el cmdlet Receive-Job varias veces para obtener todos los resultados. De forma predeterminada, cada vez que lo use, obtendrá solo 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 los resultados más recientes a medida que se reciban, o bien esperar y comprobar el estado del trabajo más tarde.

Puede usar el parámetro Wait del cmdlet Receive-Job, que no devuelve el símbolo del sistema hasta que el trabajo se completa y están disponibles todos los resultados.

También puede usar el cmdlet Wait-Job para esperar a que estén disponibles todos los resultados del trabajo o alguno de ellos. Wait-Job le permite esperar hasta que se complete un trabajo determinado, uno cualquiera o todos los trabajos.

El siguiente comando usa el cmdlet Wait-Job para esperar por un trabajo cuyo identificador es 10.

Wait-Job -ID 10

Por ello, se suprime el símbolo del sistema de Windows PowerShell hasta que se completa el trabajo.

También puede esperar durante un período de tiempo predeterminado. Este comando usa el parámetro Timeout para limitar la espera a 120 segundos. Una vez superad el tiempo de espera, se devuelve el símbolo del sistema, pero el trabajo continúa ejecutándose en segundo plano.

Wait-Job -ID 10 -Timeout 120

DETENCIÓN DE UN TRABAJO

Para detener un trabajo en segundo plano, use 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 siguiente comando detiene el trabajo. Usa un operador de canalización (|) para enviar el trabajo de la variable $job a Stop-Job.

$job | Stop-Job

ELIMINACIÓN DE UN TRABAJO

Para eliminar un trabajo en segundo plano, use el cmdlet Remove-Job. El siguiente comando elimina el trabajo en la variable $job.

Remove-Job -Job $job

INVESTIGACIÓN DE UN TRABAJO CON ERROR

Para averiguar por qué se produce un error en un trabajo, use la subpropiedad Reason del objeto de trabajo.

El comando siguiente inicia un trabajo sin las credenciales necesarias. Guardar 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:\S...

El comando siguiente usa la propiedad Reason para encontrar el problema que causó el error en el trabajo.

         $job.ChildJobs[0].JobStateInfo.Reason

En este caso, se produjo un error en el trabajo porque el equipo remoto requiere credenciales explícitas para ejecutar el comando. El valor de la propiedad Reason es:

         Connecting to remote server failed with the following error 
         message : Access is denied.

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