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