about_Job_Details

Descripción breve

Proporciona detalles sobre los trabajos en segundo plano en equipos locales y remotos.

Descripción detallada

En este tema se explica el concepto de un trabajo en segundo plano y se proporciona información técnica sobre cómo funcionan los trabajos en segundo plano en PowerShell.

Este tema es un complemento de los temas about_Jobs, about_Thread_Jobs y about_Remote_Jobs .

Acerca de los trabajos en segundo plano

Un trabajo en segundo plano ejecuta un comando o expresión de forma asincrónica. Puede ejecutar un cmdlet, una función, un script o cualquier otra tarea basada en comandos. Está diseñado para ejecutar comandos que tardan un período de tiempo prolongado, pero puede usarlo para ejecutar cualquier comando en segundo plano.

Cuando se ejecuta un comando sincrónico, se suprime el símbolo del sistema de PowerShell hasta que se complete el comando. Pero un trabajo en segundo plano no suprime el símbolo del sistema de PowerShell. Un comando para iniciar un trabajo en segundo plano devuelve un objeto de trabajo. El mensaje devuelve inmediatamente para que pueda trabajar en otras tareas mientras se ejecuta el trabajo en segundo plano.

Sin embargo, cuando se inicia un trabajo en segundo plano, no se obtienen los resultados inmediatamente incluso si el trabajo se ejecuta muy rápidamente. El objeto de trabajo que se devuelve contiene información útil sobre el trabajo, pero no contiene los resultados del trabajo. Debe ejecutar un comando independiente para obtener los resultados del trabajo. También puede ejecutar comandos para detener el trabajo, esperar a que se complete el trabajo y eliminar el trabajo.

Para que el tiempo de un trabajo en segundo plano sea independiente de otros comandos, cada trabajo en segundo plano se ejecuta en su propia sesión de PowerShell. Sin embargo, puede ser una conexión temporal que se crea solo para ejecutar el trabajo y, a continuación, se destruye o puede ser una PSSession persistente que puede usar para ejecutar varios trabajos o comandos relacionados.

Uso de los cmdlets de trabajo

Use un Start-Job comando para iniciar un trabajo en segundo plano en un equipo local. Start-Job devuelve un objeto de trabajo. También puede obtener objetos que representan los trabajos que se iniciaron en el equipo local mediante el Get-Job cmdlet .

Para obtener los resultados del trabajo, use un Receive-Job comando . Si el trabajo no está completo, Receive-Job devuelve resultados parciales. También puede usar el Wait-Job cmdlet para suprimir el símbolo del sistema hasta que se completen uno o todos los trabajos que se iniciaron en la sesión.

Para detener un trabajo en segundo plano, use el Stop-Job cmdlet . Para eliminar un trabajo, use el Remove-Job cmdlet .

Para obtener más información sobre cómo funcionan los cmdlets, consulte el tema ayuda de cada cmdlet y consulte about_Jobs.

Inicio de trabajos en segundo plano en equipos remotos

Puede crear y administrar trabajos en segundo plano en un equipo local o remoto. Para ejecutar un trabajo en segundo plano de forma remota, use el parámetro AsJob de un cmdlet como Invoke-Command, o use el Invoke-Command cmdlet para ejecutar un Start-Job comando de forma remota. También puede iniciar un trabajo en segundo plano en una sesión interactiva.

Para obtener más información sobre los trabajos en segundo plano remotos, consulte about_Remote_Jobs.

Trabajos secundarios

Cada trabajo en segundo plano consta de un trabajo primario y uno o varios trabajos secundarios. En los trabajos iniciados mediante Start-Job o el parámetro AsJob de Invoke-Command, el trabajo primario es un ejecutivo. No ejecuta ningún comando ni devuelve ningún resultado. Los comandos se ejecutan realmente mediante los trabajos secundarios. Los trabajos que se empezaron a usar otros cmdlets podrían funcionar de forma diferente.

Los trabajos secundarios se almacenan en la propiedad ChildJobs del objeto de trabajo primario. La propiedad ChildJobs puede contener uno o varios objetos de trabajo secundarios. Los objetos de trabajo secundarios tienen un Name, ID y InstanceId que difieren del trabajo primario para que pueda administrar los trabajos primarios y secundarios individualmente o como una unidad.

Para obtener los trabajos primarios y secundarios de un trabajo, use el parámetro IncludeChildJobs del Get-Job cmdlet . El parámetro IncludeChildJob se introdujo en Windows PowerShell 3.0.

PS> Get-Job -IncludeChildJob

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

Para obtener el trabajo primario y solo los trabajos secundarios con un valor de estado determinado, use el parámetro ChildJobState del Get-Job cmdlet . El parámetro ChildJobState se introdujo en Windows PowerShell 3.0.

PS> Get-Job -ChildJobState Failed

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
3  Job3                 Failed     False         localhost   Get-Process

Para obtener los trabajos secundarios de un trabajo en todas las versiones de PowerShell, use la propiedad ChildJob del trabajo primario.

PS> (Get-Job Job1).ChildJobs

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

También puede usar un Get-Job comando en el trabajo secundario, como se muestra en el siguiente comando:

PS> Get-Job Job3

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
3  Job3                 Failed     False         localhost   Get-Process

La configuración del trabajo secundario depende del comando que use para iniciar el trabajo.

  • Cuando se usa Start-Job para iniciar un trabajo en un equipo local, el trabajo consta de un trabajo primario ejecutivo y un trabajo secundario que ejecuta el comando.

  • Cuando se usa el parámetro AsJob de Invoke-Command para iniciar un trabajo en uno o varios equipos, el trabajo consta de un trabajo primario ejecutivo y un trabajo secundario para cada trabajo que se ejecuta en cada equipo.

  • Cuando se usa Invoke-Command para ejecutar un Start-Job comando en uno o varios equipos remotos, el resultado es el mismo que un comando local que se ejecuta en cada equipo remoto. El comando devuelve un objeto de trabajo para cada equipo. El objeto de trabajo consta de un trabajo primario ejecutivo y un trabajo secundario que ejecuta el comando .

El trabajo primario representa todos los trabajos secundarios. Al administrar un trabajo primario, también se administran los trabajos secundarios asociados. Por ejemplo, si detiene un trabajo primario, se detienen todos los trabajos secundarios. Si obtiene los resultados de un trabajo primario, obtendrá los resultados de todos los trabajos secundarios.

Sin embargo, también puede administrar trabajos secundarios individualmente. Esto resulta más útil cuando desea investigar un problema con un trabajo o obtener los resultados de solo uno de los trabajos secundarios que se han iniciado con el parámetro AsJob de Invoke-Command.

El comando siguiente usa el parámetro AsJob de Invoke-Command para iniciar trabajos en segundo plano en el equipo local y dos equipos remotos. El comando guarda el trabajo en la $j variable .

PS> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob

Al mostrar las propiedades Name y ChildJob del trabajo en $j, muestra que el comando devolvió un objeto de trabajo con tres trabajos secundarios, uno para cada equipo.

PS> $j | Format-List Name, ChildJobs

Name      : Job3
ChildJobs : {Job4, Job5, Job6}

Al mostrar el trabajo primario, se muestra que se produjo un error en el trabajo.

PS> $j

Id Name   PSJobTypeName State      HasMoreData   Location
-- ----   ------------- -----      -----------   --------
3  Job3   RemotingJob   Failed     False         localhost,Server...

Pero cuando se ejecuta un Get-Job comando que obtiene los trabajos secundarios, la salida muestra que solo se produjo un error en un trabajo secundario.

PS> Get-Job -IncludeChildJobs

Id  Name   PSJobTypeName State      HasMoreData   Location    Command
--  ----   ------------- -----      -----------   --------    -------
3   Job3   RemotingJob   Failed     False         localhost,Server...
4   Job4                 Completed  True          localhost   Get-Date
5   Job5                 Failed     False         Server01    Get-Date
6   Job6                 Completed  True          Server02    Get-Date

Para obtener los resultados de todos los trabajos secundarios, use el Receive-Job cmdlet para obtener los resultados del trabajo primario. Pero también puede obtener los resultados de un trabajo secundario determinado, como se muestra en el siguiente comando.

PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02     Thursday, March 13, 2008 4:16:03 PM

La característica trabajos secundarios de trabajos en segundo plano de PowerShell proporciona más control sobre los trabajos que ejecuta.

Tipos de trabajo

PowerShell admite diferentes tipos de trabajos para diferentes tareas. A partir de Windows PowerShell 3.0, los desarrolladores pueden escribir "adaptadores de origen de trabajo" que agreguen nuevos tipos de trabajo a PowerShell e incluyan los adaptadores de origen de trabajo en los módulos. Al importar el módulo, puede usar el nuevo tipo de trabajo en la sesión.

Por ejemplo, el módulo PSScheduledJob agrega trabajos programados y el módulo PSWorkflow agrega trabajos de flujo de trabajo.

Los tipos de trabajos personalizados pueden diferir significativamente de los trabajos en segundo plano estándar de PowerShell. Por ejemplo, los trabajos programados se guardan en el disco; no existen solo en una sesión determinada. Los trabajos de flujo de trabajo se pueden suspender y reanudar.

Los cmdlets que se usan para administrar trabajos personalizados dependen del tipo de trabajo. Para algunos, use los cmdlets de trabajo estándar, como Get-Job y Start-Job. Otros incluyen cmdlets especializados que administran solo un tipo determinado de trabajo. Para obtener información detallada sobre los tipos de trabajo personalizados, consulte los temas de ayuda sobre el tipo de trabajo.

Para buscar el tipo de trabajo de un trabajo, use el Get-Job cmdlet . Get-Job devuelve objetos de trabajo diferentes para distintos tipos de trabajos. El valor de la propiedad PSJobTypeName de los objetos de trabajo que Get-Job devuelve indica el tipo de trabajo.

En la tabla siguiente se enumeran los tipos de trabajo que se incluyen con PowerShell.

Tipo de trabajo Descripción
BackgroundJob Empiece a usar el Start-Job cmdlet .
RemoteJob Introducción al uso del parámetro AsJob del
cmdlet Invoke-Command.
PSWorkflowJob Comenzó a usar el parámetro AsJob de un flujo de trabajo.
PSScheduledJob Instancia de un trabajo programado iniciado por un desencadenador de trabajo.
CIMJob Introducción al uso del parámetro AsJob de un cmdlet desde
Módulo CDXML.
WMIJob Introducción al uso del parámetro AsJob de un cmdlet desde
Módulo WMI.
PSEventJob Creado medianteRegister-ObjectEvent y especificando un
acción con el parámetro Action .

NOTA: Antes de usar el Get-Job cmdlet para obtener trabajos de un tipo determinado, compruebe que el módulo que agrega el tipo de trabajo se importa en la sesión actual. De lo contrario, Get-Job no obtiene trabajos de ese tipo.

Ejemplos

Los comandos siguientes crean un trabajo en segundo plano local, un trabajo en segundo plano remoto, un trabajo de flujo de trabajo y un trabajo programado. A continuación, usa el Get-Job cmdlet para obtener los trabajos. Get-Job no obtiene el trabajo programado, pero obtiene ninguna instancia iniciada del trabajo programado.

Inicie un trabajo en segundo plano en el equipo local.

PS> Start-Job -Name LocalData {Get-Process}

Id Name        PSJobTypeName   State   HasMoreData   Location   Command
-- ----        -------------   -----   -----------   --------   -------
2  LocalData   BackgroundJob   Running        True   localhost  Get-Process

Inicie un trabajo en segundo plano que se ejecute en un equipo remoto.

PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData

Id  Name        PSJobTypeName  State   HasMoreData   Location   Command
--  ----        -------------  -----   -----------   --------   -------
2   RemoteData  RemoteJob      Running        True   Server01   Get-Process

Creación de un trabajo programado

PS>  Register-ScheduledJob -Name ScheduledJob -ScriptBlock `
 {Get-Process} -Trigger (New-JobTrigger -Once -At "3 PM")

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

Cree un flujo de trabajo.

PS> workflow Test-Workflow {Get-Process}

Ejecute el flujo de trabajo como trabajo.


PS> Test-Workflow -AsJob -JobName TestWFJob

Id  Name       PSJobTypeName   State   HasMoreData   Location   Command
--  ----       -------------   -----   -----------   --------   -------
2   TestWFJob  PSWorkflowJob   NotStarted     True   localhost  Get-Process

Obtenga los trabajos. El Get-Job comando no obtiene trabajos programados, pero obtiene instancias del trabajo programado que se inicia.

PS> Get-Job

Id  Name         PSJobTypeName  State     HasMoreData  Location  Command
--  ----         -------------  -----     -----------  --------  -------
2   LocalData    BackgroundJob  Completed True         localhost Get-Process
4   RemoteData   RemoteJob      Completed True         Server01  Get-Process
6   TestWFJob    PSWorkflowJob  Completed True         localhost WorkflowJob
8   ScheduledJob PSScheduledJob Completed True         localhost Get-Process

Para obtener trabajos programados, use el Get-ScheduledJob cmdlet .

PS> Get-ScheduledJob

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

Consulte también