Acerca de los trabajosAbout Jobs

Descripción breveShort description

Proporciona información sobre cómo los trabajos en segundo plano de PowerShell ejecutan un comando o una expresión en segundo plano sin interactuar con la sesión actual.Provides information about how PowerShell background jobs run a command or expression in the background without interacting with the current session.

Descripción largaLong description

PowerShell ejecuta simultáneamente comandos y scripts a través de trabajos.PowerShell concurrently runs commands and scripts through jobs. PowerShell proporciona tres tipos de trabajos para admitir la simultaneidad.There are three jobs types provided by PowerShell to support concurrency.

  • RemoteJob : Los comandos y los scripts se ejecutan en una sesión remota.RemoteJob - Commands and scripts run on a remote session. Para obtener más información, consulte about_Remote_Jobs.For information, see about_Remote_Jobs.
  • BackgroundJob : Los comandos y los scripts se ejecutan en un proceso independiente en el equipo local.BackgroundJob - Commands and scripts run in a separate process on the local machine.
  • PSTaskJob o bien ThreadJob , los comandos y los scripts se ejecutan en un subproceso independiente en el mismo proceso en el equipo local.PSTaskJob or ThreadJob - Commands and scripts run in a separate thread within the same process on the local machine. Para obtener más información, vea about_Thread_Jobs.For more information, see about_Thread_Jobs.

La ejecución remota de scripts, en un equipo independiente o en un proceso independiente, proporciona un aislamiento excelente.Running scripts remotely, on a separate machine or in a separate process, provides great isolation. Los errores que se producen en el trabajo remoto no afectan a otros trabajos en ejecución o a la sesión primaria que inició el trabajo.Any errors that occur in the remote job do not affect other running jobs or the parent session that started the job. Sin embargo, el nivel de comunicación remota agrega sobrecarga, incluida la serialización de objetos.However, the remoting layer adds overhead, including object serialization. Todos los objetos se serializan y deserializan a medida que se pasan entre la sesión primaria y la sesión remota (trabajo).All objects are serialized and deserialized as they are passed between the parent session and the remote (job) session. La serialización de objetos de datos complejos de gran tamaño puede consumir grandes cantidades de recursos de proceso y memoria, y transferir grandes cantidades de datos a través de la red.Serialization of large complex data objects can consume large amounts of compute and memory resources and transfer large amounts of data across the network.

Los trabajos basados en subprocesos no son tan sólidos como los trabajos remotos y en segundo plano, ya que se ejecutan en el mismo proceso en subprocesos diferentes.Thread-based jobs are not as robust as remote and background jobs, because they run in the same process on different threads. Si un trabajo tiene un error crítico que bloquea el proceso, se finalizan todos los demás trabajos del proceso.If one job has a critical error that crashes the process, then all other jobs in the process are terminated.

Sin embargo, los trabajos basados en subprocesos requieren menos sobrecarga.However, thread-based jobs require less overhead. No usan la capa de comunicación remota o la serialización.They don't use the remoting layer or serialization. Los objetos de resultado se devuelven como referencias a objetos activos en la sesión actual.The result objects are returned as references to live objects in the current session. Sin esta sobrecarga, los trabajos basados en subprocesos se ejecutan más rápido y utilizan menos recursos que los otros tipos de trabajo.Without this overhead, thread-based jobs run faster and use fewer resources than the other job types.

Importante

La sesión primaria que creó el trabajo también supervisa el estado del trabajo y recopila los datos de canalización.The parent session that created the job also monitors the job status and collects pipeline data. El proceso principal finaliza el proceso secundario una vez que el trabajo alcanza un estado finalizado.The job child process is terminated by the parent process once the job reaches a finished state. Si finaliza la sesión primaria, todos los trabajos secundarios en ejecución se finalizan junto con sus procesos secundarios.If the parent session is terminated, all running child jobs are terminated along with their child processes.

Hay dos formas de solucionar este problema:There are two ways work around this situation:

  1. Invoke-CommandSe usa para crear trabajos que se ejecutan en sesiones desconectadas.Use Invoke-Command to create jobs that run in disconnected sessions. Para obtener más información, vea about_Remote_Jobs.For more information, see about_Remote_Jobs.
  2. Use Start-Process para crear un nuevo proceso en lugar de un trabajo.Use Start-Process to create a new process rather than a job. Para obtener más información, vea Start-Process.For more information, see Start-Process.

Cmdlets de trabajoThe job cmdlets

CmdletCmdlet DescripciónDescription
Start-Job Inicia un trabajo en segundo plano en un equipo local.Starts a background job on a local computer.
Get-Job Obtiene los trabajos en segundo plano que se iniciaron en elGets the background jobs that were started in the
sesión actual.current session.
Receive-Job Obtiene los resultados de los trabajos en segundo plano.Gets the results of background jobs.
Stop-Job Detiene un trabajo en segundo plano.Stops a background job.
Wait-Job Suprime el símbolo del sistema hasta que uno o todos los trabajos seanSuppresses the command prompt until one or all jobs are
finaliza.complete.
Remove-Job Elimina un trabajo en segundo plano.Deletes a background job.
Invoke-Command El parámetro AsJob crea un trabajo en segundo plano en unThe AsJob parameter creates a background job on a
equipo remoto.remote computer. Puede usar Invoke-Command para ejecutarYou can use Invoke-Command to run
cualquier comando de trabajo de forma remota, incluido Start-Job .any job command remotely, including Start-Job.

Cómo iniciar un trabajo en el equipo localHow to start a job on the local computer

Para iniciar un trabajo en segundo plano en el equipo local, use el Start-Job cmdlet.To start a background job on the local computer, use the Start-Job cmdlet.

Para escribir un Start-Job comando, escriba el comando que el trabajo ejecuta entre llaves ( {} ).To write a Start-Job command, enclose the command that the job runs in curly braces ({}). Use el parámetro ScriptBlock para especificar el comando.Use the ScriptBlock parameter to specify the command.

El comando siguiente inicia un trabajo en segundo plano que ejecuta un Get-Process comando en el equipo local.The following command starts a background job that runs a Get-Process command on the local computer.

Start-Job -ScriptBlock {Get-Process}

Cuando se inicia un trabajo en segundo plano, el símbolo del sistema se devuelve inmediatamente, aunque el trabajo tarde mucho tiempo en completarse.When you start a background job, the command prompt returns immediately, even if the job takes an extended time to complete. Puede seguir trabajando en la sesión sin interrupción mientras se ejecuta el trabajo.You can continue to work in the session without interruption while the job runs.

El Start-Job comando devuelve un objeto que representa el trabajo.The Start-Job command returns an object that represents the job. El objeto de trabajo contiene información útil sobre el trabajo, pero no contiene los resultados del trabajo.The job object contains useful information about the job, but it does not contain the job results.

Puede guardar el objeto de trabajo en una variable y usarlo con los otros cmdlets de trabajo para administrar el trabajo en segundo plano.You can save the job object in a variable and then use it with the other Job cmdlets to manage the background job. El comando siguiente inicia un objeto de trabajo y guarda el objeto de trabajo resultante en la $job variable.The following command starts a job object and saves the resulting job object in the $job variable.

$job = Start-Job -ScriptBlock {Get-Process}

A partir de PowerShell 6,0, puede usar el operador en segundo plano ( & ) al final de una canalización para iniciar un trabajo en segundo plano.Beginning in PowerShell 6.0, you can use the background operator (&) at the end of a pipeline to start a background job. Para obtener más información, vea operador Background.For more information, see background operator.

Usar el operador background es funcionalmente equivalente a usar el Start-Job cmdlet en el ejemplo anterior.Using the background operator is functionally equivalent to using the Start-Job cmdlet in the previous example.

$job = Get-Process &

Obtención de objetos de trabajoGetting job objects

El Get-Job cmdlet devuelve objetos que representan los trabajos en segundo plano que se iniciaron en la sesión actual.The Get-Job cmdlet returns objects that represent the background jobs that were started in the current session. Sin parámetros, Get-Job devuelve todos los trabajos que se iniciaron en la sesión actual.Without parameters, Get-Job returns all of the jobs that were started in the current session.

Get-Job

El objeto de trabajo contiene el estado del trabajo, que indica si el trabajo ha finalizado.The job object contains the state of the job, which indicates whether the job has finished. Un trabajo terminado tiene un estado completado o con errores.A finished job has a state of Complete or Failed. También es posible que un trabajo esté bloqueado o en ejecución.A job might also be Blocked or Running.

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Complete   True         localhost  Get-Process

Puede guardar el objeto de trabajo en una variable y usarlo para representar el trabajo en un comando posterior.You can save the job object in a variable and use it to represent the job in a later command. El siguiente comando obtiene el trabajo con el identificador 1 y lo guarda en la $job variable.The following command gets the job with ID 1 and saves it in the $job variable.

$job = Get-Job -Id 1

Obtener los resultados de un trabajoGetting the results of a job

Al ejecutar un trabajo en segundo plano, los resultados no aparecen inmediatamente.When you run a background job, the results do not appear immediately. Para obtener los resultados de un trabajo en segundo plano, use el Receive-Job cmdlet.To get the results of a background job, use the Receive-Job cmdlet.

En el ejemplo siguiente, el Receive-Job cmdlet obtiene los resultados del trabajo mediante el objeto de trabajo en la $job variable.The following example, the Receive-Job cmdlet gets the results of the job using job object in the $job variable.

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
    668       7     2672       6168   104    32.26   488 csrss
...

Puede guardar los resultados de un trabajo en una variable.You can save the results of a job in a variable. El siguiente comando guarda los resultados del trabajo en la $job variable en la $results variable.The following command saves the results of the job in the $job variable to the $results variable.

$results = Receive-Job -Job $job

Obtener y mantener los resultados de trabajos parcialesGetting and keeping partial job results

El Receive-Job cmdlet obtiene los resultados de un trabajo en segundo plano.The Receive-Job cmdlet gets the results of a background job. Si el trabajo se ha completado, Receive-Job obtiene todos los resultados del trabajo.If the job is complete, Receive-Job gets all job results. Si el trabajo sigue en ejecución, Receive-Job obtiene los resultados que se han generado hasta ahora.If the job is still running, Receive-Job gets the results that have been generated thus far. Puede Receive-Job volver a ejecutar los comandos para obtener los resultados restantes.You can run Receive-Job commands again to get the remaining results.

De forma predeterminada, Receive-Job elimina los resultados de la caché donde se almacenan los resultados del trabajo.By default, Receive-Job deletes the results from the cache where job results are stored. Cuando Receive-Job vuelva a ejecutar, obtendrá solo los nuevos resultados que llegaron después de la primera ejecución.When you run Receive-Job again, you get only the new results that arrived after the first run.

Los comandos siguientes muestran los resultados de los Receive-Job comandos que se ejecutan antes de que se complete el trabajo.The following commands show the results of Receive-Job commands run before the job is complete.

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

Use el parámetro Keep para impedir que Receive-Job se eliminen los resultados del trabajo que se devuelven.Use the Keep parameter to prevent Receive-Job from deleting the job results that are returned. Los siguientes comandos muestran el efecto de usar el parámetro Keep en un trabajo que aún no se ha completado.The following commands show the effect of using the Keep parameter on a job that is not yet complete.

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

Esperando los resultadosWaiting for the results

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.If you run a command that takes a long time to complete, you can use the properties of the job object to determine when the job is complete. El siguiente comando usa el Get-Job objeto para obtener todos los trabajos en segundo plano en la sesión actual.The following command uses the Get-Job object to get all of the background jobs in the current session.

Get-Job

Los resultados aparecen en una tabla.The results appear in a table. El estado del trabajo aparece en la columna Estado .The status of the job appears in the State column.

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.In this case, the State property reveals that Job 2 is still running. Si usa el Receive-Job cmdlet para obtener los resultados del trabajo ahora, los resultados serían incompletos.If you were to use the Receive-Job cmdlet to get the job results now, the results would be incomplete. Puede usar el Receive-Job cmdlet varias veces para obtener todos los resultados.You can use the Receive-Job cmdlet repeatedly to get all of the results. Use la propiedad State para determinar cuándo se ha completado el trabajo.Use the State property to determine when the job is complete.

También puede usar el parámetro Wait del Receive-Job cmdlet.You can also use the Wait parameter of the Receive-Job cmdlet. Cuando use este parámetro, el cmdlet no devolverá el símbolo del sistema hasta que se complete el trabajo y todos los resultados estén disponibles.When use use this parameter, the cmdlet does not return the command prompt until the job is completed and all results are available.

También puede usar el Wait-Job cmdlet para esperar a cualquiera de los resultados del trabajo o a todos.You can also use the Wait-Job cmdlet to wait for any or all of the results of the job. Wait-Job permite esperar a un trabajo específico o a todos los trabajos.Wait-Job lets you wait for one or more specific job or for all jobs. El siguiente comando usa el Wait-Job cmdlet para esperar un trabajo con el identificadorThe following command uses the Wait-Job cmdlet to wait for a job with ID 10.

Wait-Job -ID 10

Como resultado, el símbolo del sistema de PowerShell se suprime hasta que se completa el trabajo.As a result, the PowerShell prompt is suppressed until the job is completed.

También puede esperar un período de tiempo predeterminado.You can also wait for a predetermined period of time. Este comando usa el parámetro timeout para limitar la espera a 120 segundos.This command uses the Timeout parameter to limit the wait to 120 seconds. Cuando expira el tiempo, el símbolo del sistema vuelve, pero el trabajo continúa ejecutándose en segundo plano.When the time expires, the command prompt returns, but the job continues to run in the background.

Wait-Job -ID 10 -Timeout 120

Detener un trabajoStopping a job

Para detener un trabajo en segundo plano, use el Stop-Job cmdlet.To stop a background job, use the Stop-Job cmdlet. El comando siguiente inicia un trabajo para obtener todas las entradas en el registro de eventos del sistema.The following command starts a job to get every entry in the System event log. Guarda el objeto de trabajo en la $job variable.It saves the job object in the $job variable.

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

El siguiente comando detiene el trabajo.The following command stops the job. Usa un operador de canalización ( | ) para enviar el trabajo de la $job variable a Stop-Job .It uses a pipeline operator (|) to send the job in the $job variable to Stop-Job.

$job | Stop-Job

Eliminar un trabajoDeleting a job

Para eliminar un trabajo en segundo plano, use el Remove-Job cmdlet.To delete a background job, use the Remove-Job cmdlet. El siguiente comando elimina el trabajo de la $job variable.The following command deletes the job in the $job variable.

Remove-Job -Job $job

Investigación de un trabajo con errorInvestigating a failed job

Se puede producir un error en los trabajos por muchas razones.Jobs can fail for many reasons. el objeto de trabajo contiene una propiedad motivo que contiene información sobre la causa del error.the job object contains a Reason property that contains information about the cause of the failure.

En el ejemplo siguiente se inicia un trabajo sin las credenciales necesarias.The following example starts a job without the required credentials.

$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job

Id Name  PSJobTypeName State  HasMoreData  Location  Command
-- ----  ------------- -----  -----------  --------  -------
1  Job1  BackgroundJob Failed False        localhost New-Item -Path HKLM:...

Inspeccione la propiedad motivo para encontrar el error que provocó un error en el trabajo.Inspect the Reason property to find the error that caused the job to fail.

$job.ChildJobs[0].JobStateInfo.Reason

En este caso, se produjo un error en el trabajo porque el equipo remoto requirió credenciales explícitas para ejecutar el comando.In this case, the job failed because the remote computer required explicit credentials to run the command. La propiedad Reason contiene el siguiente mensaje:The Reason property contains the following message:

No se pudo conectar con el servidor remoto. mensaje de error: "acceso denegado".Connecting to remote server failed with the following error message: "Access is denied".

Consulte tambiénSee also