Compartir a través de


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 devuelto 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, Idy InstanceId que difieren del trabajo primario para poder 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.

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.

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.

(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:

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 .

$invokeCommandSplat = @{
    ComputerName = 'localhost', 'Server01', 'Server02'
    ScriptBlock = {Get-Date}
    AsJob = $true
}
$j = Invoke-Command @invokeCommandSplat

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.

$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.

$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.

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.

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 lista siguiente se describen los tipos de trabajo integrados de PowerShell.

  • backgroundJob: se ha empezado a usar el cmdlet Start-Job.
  • remoteJob: se ha empezado a usar el parámetro de AsJob del cmdlet Invoke-Command.
  • CIMJob: se ha empezado a usar el parámetro de AsJob de un cmdlet desde un módulo CDXML.
  • WMIJob: se inició el uso del parámetro de AsJob de un cmdlet desde un módulo WMI.
  • PSEventJob: creado conRegister-ObjectEvent y especificando una acción con el parámetro Action Action.

Nota

Antes de usar el cmdlet Get-Job 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 pueden obtener trabajos de ese tipo.

Windows PowerShell 5.1 incluye los siguientes tipos de trabajo adicionales.

  • psWorkflowJob: se ha empezado a usar el parámetro de AsJob de un flujo de trabajo.
  • PSScheduledJob: una instancia de un trabajo programado iniciado por un desencadenador de trabajo.

Estos tipos de trabajo solo están disponibles en Windows PowerShell 5.1. Los módulos que agregan estos tipos de trabajo no son compatibles con PowerShell 6.0 y versiones posteriores.

Para obtener más información, consulte los artículos siguientes:

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 las instancias iniciadas 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.

$invokeCommandSplat = @{
    ComputerName = 'Server01'
    AsJob = $true
    JobName = 'RemoteData'
    ScriptBlock = {Get-Process}
}
Invoke-Command @invokeCommandSplat
Id  Name        PSJobTypeName  State   HasMoreData   Location   Command
--  ----        -------------  -----   -----------   --------   -------
2   RemoteData  RemoteJob      Running        True   Server01   Get-Process

Consulte también