Compartir a través de


Acerca de Jobs

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 interrupciones mientras se ejecuta la tarea.

LOS 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 el archivo
sesión en curso.
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 se
í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 puedes usar
Invoke-Command Para ejecutar cualquier comando de trabajo de forma remota,
incluyendo 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 se ejecuta el trabajo entre llaves ( { } ). Utilice el parámetro ScriptBlock para especificar el comando.

El comando siguiente 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 job 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 los demás cmdlets de trabajo 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 representen los trabajos iniciados en la sesión actual. Get-Job Devuelve el mismo objeto de trabajo que devuelve Start-Job.

OBTENCIÓN DE OBJETOS DE TRABAJO

Para obtener objetos que representen 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 utilizarlo para representar el trabajo en un comando posterior. El siguiente comando obtiene el trabajo con el ID 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 de "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 se 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 siguiente comando usa 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 puede guardar los resultados de un trabajo en una variable. El siguiente comando 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 redireccionamiento (>) o el cmdlet Out-File. El siguiente comando utiliza el operador de redireccionamiento para guardar los resultados del trabajo en la variable $job del archivo Results.txt.

Receive-Job -Job $job > results.txt

OBTENER Y CONSERVAR RESULTADOS PARCIALES DEL TRABAJO

El cmdlet Receive-Job obtiene los resultados de un trabajo en segundo plano. Si se ha completado el trabajo, Receive-Job obtiene todos los resultados del trabajo. Si el trabajo aún se está ejecutando, Receive-Job obtiene los resultados que se han generado hasta el momento. Puede ejecutar Receive-Job comandos de nuevo para obtener los resultados restantes.

Cuando Receive-Job devuelve resultados, de forma predeterminada, los elimina 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 comandos siguientes muestran los resultados de Receive-Job comandos se ejecutan antes de 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 que se eliminen los resultados del trabajo que ha devuelto, utilice 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 utilizar 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

A LA ESPERA DE 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 ha completado el trabajo. El siguiente comando utiliza 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 cmdlet Receive-Job para obtener los resultados del trabajo ahora, los resultados estarían incompletos. Puede usar el cmdlet Receive-Job 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 se 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 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 cmdlet Wait-Job para esperar a cualquiera o todos los resultados del trabajo. Wait-Job Le permite esperar a que se complete un trabajo en particular, 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 utiliza el parámetro Timeout para limitar la espera a 120 segundos. Cuando expire 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 cmdlet Stop-Job. El comando siguiente 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 comando siguiente detiene el trabajo. Utiliza 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 FALLIDO

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

El siguiente comando 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 siguiente comando utiliza la propiedad Reason para buscar el error que provocó el error que provocó el 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:

Se produjo un error al conectarse al servidor remoto con el siguiente mensaje de error: Se ha denegado el acceso.

VÉASE TAMBIÉN

about_Remote_Jobs

about_Job_Details

about_Remote

about_PSSessions

Inicio-Trabajo

Conseguir trabajo

Recibir-Trabajo

Detener el trabajo

Trabajo en espera

Eliminar-Trabajo

Comando de invocación