about_Job_Details

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

TEMA

about_Job_Details

DESCRIPCIÓN BREVE

Proporciona información detallada 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 ofrece información técnica sobre el funcionamiento de los trabajos en segundo plano en Windows PowerShell®.

Este tema es un suplemento a los temas about_Jobs y about_Remote_Jobs.

ACERCA DE LOS TRABAJOS EN SEGUNDO PLANO

Un trabajo en segundo plano ejecuta un comando o una 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 largo período de tiempo, pero se puede utilizar para ejecutar cualquier comando en segundo plano.

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

Sin embargo, cuando se inicia un trabajo en segundo plano, no obtendrá los resultados inmediatamente, incluso aunque el trabajo se ejecute 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 el trabajo se complete y eliminar el trabajo.

Para realizar la sincronización de un trabajo en segundo plano independiente de otros comandos, cada trabajo en segundo plano se ejecuta su propio entorno de Windows PowerShell (una "sesión"). Sin embargo, puede tratarse de una conexión temporal creada solo para ejecutar el trabajo y después destruirse, o puede ser una sesión persistente (una PSSession) que puede usar para ejecutar varios comandos o trabajos relacionados.

USO DE LOS CMDLETS JOB

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

Para obtener los resultados del trabajo, use un comando Receive-Job. Si el trabajo no se completó, Receive-Job devuelve resultados parciales. También puede usar el cmdlet Wait-Job 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 cmdlet Stop-Job. Para eliminar un trabajo, use el cmdlet Remove-Job.

Para más información sobre cómo funcionan los cmdlets, vea el tema de 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 cmdlet Invoke-Command para ejecutar un comando Start-Job de forma remota. También puede iniciar un trabajo en segundo plano en una sesión interactiva.

Para más información sobre los trabajos en segundo plano remotos, vea la página 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 con el parámetro AsJob de Invoke-Command, el trabajo primario es ejecutivo. No ejecuta ningún comando ni devuelve ningún resultado. Los trabajos secundarios son los que ejecutan realmente los comandos. (Los trabajos iniciados con otros cmdlets podrían funcionan 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 nombre, un identificador y un identificador de instancia que difieren de los 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 cmdlet Get-Job. El parámetro IncludeChildJob se introdujo en Windows PowerShell 3.0.

        C:\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 determinado valor State, utilice el parámetro ChildJobState del cmdlet Get-Job. El parámetro ChildJobState se introdujo en Windows PowerShell 3.0.

        C:\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 Windows PowerShell, utilice la propiedad ChildJob del trabajo primario.

        C:\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 utilizar un comando Get-Job en el trabajo secundario, como se muestra en el siguiente comando:

        C:\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 se utilice para iniciarlo.

Cuando se utiliza 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.

Si se usa el parámetro AsJob de Invoke-Command para iniciar un trabajo en uno o varios equipos, el trabajo constará de un trabajo primario ejecutivo y un trabajo secundario por cada trabajo que se ejecute en cada equipo.

Cuando use Invoke-Command para ejecutar un comando Start-Job en uno o varios equipos remotos, el resultado es el mismo que el de un comando local que se ejecuta en cada equipo remoto. El comando devuelve un objeto de trabajo por 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. Cuando se administra un trabajo primario, también se administran los trabajos secundarios asociados. Por ejemplo, si se detiene un trabajo primario, se detienen todos los trabajos secundarios. Si se obtienen los resultados de un trabajo primario, obtendrá los resultados de todos los trabajos secundarios.

Sin embargo, también puede administrar los trabajos secundarios individualmente. Esto es muy útil cuando quiera investigar un problema con un trabajo u obtener los resultados de solo uno de varios trabajos secundarios iniciados con el parámetro AsJob de Invoke-Command. (El carácter de acento grave [`] es el carácter de continuación).

El comando siguiente utiliza 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 variable $j.

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

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

        CPS C:> $j | Format-List Name, ChildJobs

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

Cuando se muestra el trabajo primario, se muestra que el trabajo no se realizó correctamente.

        C:\PS> $j

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

Pero cuando se ejecuta un comando Get-Job que obtiene los trabajos secundarios, la salida muestra que solo uno de los trabajos secundarios no se realizó correctamente.

        PS C:\> 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 cmdlet Receive-Job 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.

        C:\PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName, DateTime -Auto

        ComputerName DateTime
        ------------ --------
        Server02     Thursday, March 13, 2008 4:16:03 PM

La característica de trabajos secundarios de los trabajos en segundo plano de Windows PowerShell le ofrece un mayor control sobre los trabajos que ejecute.

TIPOS DE TRABAJO

Windows PowerShell admite distintos tipos de trabajos para diferentes tareas. A partir de Windows PowerShell 3.0, los desarrolladores pueden escribir "adaptadores de origen de trabajo" que agregan nuevos tipos de trabajos a Windows PowerShell e incluir los adaptadores de origen de trabajo en 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 considerablemente de los trabajos en segundo plano de Windows PowerShell estándares. Por ejemplo, los trabajos programados se guardan en disco; no existen solo en una sesión determinada. Los trabajos de flujo de trabajo se pueden suspender y reanudar.

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

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

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

      Job Type         Description
      --------         -----------
      BackgroundJob    Started by using the Start-Job cmdlet.
      RemoteJob        Started by using the AsJob parameter of the 
                       Invoke-Command cmdlet.
      PSWorkflowJob    Started by using the AsJob parameter of a
                       workflow.
      PSScheduledJob   An instance of a scheduled job started by
                       a job trigger.
      CIMJob           Started by using the AsJob parameter of 
                       a cmdlet from a CDXML module.
      WMIJob           Started by using the AsJob parameter of 
                       a cmdlet from a WMI module.
      PSEventJob       Created by running Register-ObjectEvent 
                       and specifying an action with the Action
                       parameter.

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 obtendrá trabajos de ese tipo.

EJEMPLO

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. Después, usa el cmdlet Get-Job para obtener los trabajos. Get-Job no obtiene el trabajo programado, pero obtiene las instancias iniciadas del trabajo programado.

    # Start a background job on the local computer.
    PS C:\> Start-Job -Name LocalData {Get-Process}

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    LocalData   BackgroundJob   Running        True     localhost  Get-Process
    # Start a background job that runs on a remote computer.
    PS C:\> Invoke-Command -ComputerName Server01 {Get-Process} -AsJob -JobName RemoteData

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    RemoteData  RemoteJob       Running        True     Server01   Get-Process
    # Create a scheduled job
    PS C:\>  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
    # Create a workflow. 
    PS C:\> workflow Test-Workflow {Get-Process}

    # Run the workflow as a job.
    PS C:\> Test-Workflow -AsJob -JobName TestWFJob

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    TestWFJob   PSWorkflowJob   NotStarted     True     localhost  Get-Process
    # Get the jobs. The Get-Job command does not get scheduled jobs, but it gets
      instances of the scheduled job that are started.

    PS C:\> 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
    # To get scheduled jobs, use the Get-ScheduledJob cmdlet.
    PS C:\> Get-ScheduledJob

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

VEA TAMBIÉN

about_Jobs

about_Remote_Jobs

about_Remote

about_Scheduled_Jobs

Invoke-Command

Start-Job

Get-Job

Wait-Job

Stop-Job

Remove-Job

Suspend-Job

Resume-Job

New-PSSession

Enter-PSSession

Exit-PSSession

Register-ScheduledJob

Get-ScheduleJob