Wait-Job

Espera hasta que uno o todos los trabajos de PowerShell que se ejecutan en la sesión estén en un estado de terminación.

Syntax

Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Id] <Int32[]>
    [<CommonParameters>]
Wait-Job
    [-Job] <Job[]>
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Name] <String[]>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-InstanceId] <Guid[]>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-State] <JobState>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Filter] <Hashtable>
    [<CommonParameters>]

Description

El Wait-Job cmdlet espera a que un trabajo esté en un estado de terminación antes de continuar la ejecución. Los estados de terminación son:

  • Completed
  • Errónea
  • Detenido
  • Suspended
  • Escenario desconectado

Puede esperar hasta que un trabajo especificado o todos los trabajos estén en un estado de terminación. También puede establecer un tiempo de espera máximo para el trabajo mediante el parámetro Timeout o usar el parámetro Force para esperar un trabajo en los Suspended estados o Disconnected .

Cuando se completen los comandos del trabajo, Wait-Job devuelve un objeto de trabajo y continúa la ejecución.

Puede usar el Wait-Job cmdlet para esperar a que se inicien trabajos mediante el Start-Job cmdlet o el parámetro AsJob del Invoke-Command cmdlet. Para obtener más información sobre los trabajos, consulta about_Jobs.

A partir de Windows PowerShell 3.0, el Wait-Job cmdlet también espera tipos de trabajo personalizados, como trabajos de flujo de trabajo e instancias de trabajos programados. Para habilitar Wait-Job la espera de trabajos de un tipo determinado, importe el módulo que admite el tipo de trabajo personalizado en la sesión antes de ejecutar el Get-Job cmdlet, ya sea mediante el Import-Module cmdlet o mediante o la obtención de un cmdlet en el módulo. Para información sobre un tipo determinado de trabajo personalizado, vea la documentación de la característica del tipo de trabajo personalizado.

Ejemplos

Ejemplo 1: Esperar a todos los trabajos

Get-Job | Wait-Job

Este comando espera a que finalicen todos los trabajos que se ejecutan en la sesión.

Ejemplo 2: Esperar a que se inicien trabajos en equipos remotos mediante Start-Job

$s = New-PSSession Server01, Server02, Server03
Invoke-Command -Session $s -ScriptBlock {Start-Job -Name Date1 -ScriptBlock {Get-Date}}
$done = Invoke-Command -Session $s -Command {Wait-Job -Name Date1}
$done.Count

3

En este ejemplo se muestra cómo usar el Wait-Job cmdlet con trabajos iniciados en equipos remotos mediante el Start-Job cmdlet . Los Start-Job comandos y Wait-Job se envían al equipo remoto mediante el Invoke-Command cmdlet .

En este ejemplo se usa Wait-Job para determinar si se ha finalizado un Get-Date comando que se ejecuta como un trabajo en tres equipos diferentes.

El primer comando crea una sesión de Windows PowerShell (PSSession) en cada uno de los tres equipos remotos y los almacena en la $s variable .

El segundo comando usa Invoke-Command para ejecutarse Start-Job en cada una de las tres sesiones de $s. Todos los trabajos se denominan Date1.

El tercer comando usa Invoke-Command para ejecutar Wait-Job. Este comando espera a que finalicen los Date1 trabajos de cada equipo. Almacena la colección resultante (matriz) de objetos de trabajo en la $done variable .

El cuarto comando usa la propiedad Count de la matriz de objetos de trabajo de la $done variable para determinar cuántos de los trabajos han finalizado.

Ejemplo 3: Determinar cuándo finaliza el primer trabajo

$s = New-PSSession -ComputerName (Get-Content -Path .\Machines.txt)
$c = 'Get-EventLog -LogName System | Where-Object {$PSItem.EntryType -eq "error" --and $PSItem.Source -eq "LSASRV"} | Out-File -FilePath Errors.txt'
Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {$Using:c}
Invoke-Command -Session $s -ScriptBlock {Wait-Job -Any}

En este ejemplo se usa el parámetro Any de Wait-Job para determinar cuándo se encuentran los primeros trabajos que se ejecutan en la sesión actual en un estado de terminación. También muestra cómo usar el Wait-Job cmdlet para esperar a que finalicen los trabajos remotos.

El primer comando crea una PSSession en cada uno de los equipos enumerados en el archivo Machines.txt y almacena los objetos PSSession en la $s variable . El comando usa el Get-Content cmdlet para obtener el contenido del archivo. El Get-Content comando se incluye entre paréntesis para asegurarse de que se ejecuta antes del New-PSSession comando.

El segundo comando almacena una Get-EventLog cadena de comandos, entre comillas, en la $c variable .

El tercer comando usa Invoke-Command el cmdlet para ejecutarse Start-Job en cada una de las sesiones de $s. El Start-Job comando inicia un trabajo que ejecuta el Get-EventLog comando en la $c variable .

El comando usa el modificador Using scope para indicar que la $c variable se definió en el equipo local. El modificador Using scope (Uso del ámbito) se presenta en Windows PowerShell 3.0. Para obtener más información sobre el modificador Using scope (Uso del modificador de ámbito), consulte about_Remote_Variables.

El cuarto comando usa Invoke-Command para ejecutar un Wait-Job comando en las sesiones. Usa el parámetro Any para esperar hasta que el primer trabajo de los equipos remotos finalice el estado.

Ejemplo 4: Establecer un tiempo de espera para trabajos en equipos remotos

PS> $s = New-PSSession -ComputerName Server01, Server02, Server03
PS> $jobs = Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {Get-Date}}
PS> $done = Invoke-Command -Session $s -ScriptBlock {Wait-Job -Timeout 30}
PS>

En este ejemplo se muestra cómo usar el parámetro Timeout de para establecer un tiempo de Wait-Job espera máximo para los trabajos que se ejecutan en equipos remotos.

El primer comando crea una PSSession en cada uno de los tres equipos remotos (Server01, Server02 y Server03) y, a continuación, almacena los objetos PSSession en la $s variable .

El segundo comando usa Invoke-Command para ejecutarse Start-Job en cada uno de los objetos PSSession de $s. Almacena los objetos de trabajo resultantes en la $jobs variable .

El tercer comando usa Invoke-Command para ejecutarse Wait-Job en cada una de las sesiones de $s. El Wait-Job comando determina si todos los comandos se han completado en un plazo de 30 segundos. Usa el parámetro Timeout con un valor de 30 para establecer el tiempo de espera máximo y, a continuación, almacena los resultados del comando en la $done variable .

En este caso, después de 30 segundos, solo se ha completo el comando del equipo Server02. Wait-Job finaliza la espera, devuelve el objeto que representa el trabajo completado y muestra el símbolo del sistema.

La $done variable contiene un objeto de trabajo que representa el trabajo que se ejecutó en Server02.

Ejemplo 5: Esperar hasta que finalice uno de varios trabajos

Wait-Job -id 1,2,5 -Any

Este comando identifica tres trabajos por sus identificadores y espera hasta que alguno de ellos esté en un estado de terminación. La ejecución continúa cuando finaliza el primer trabajo.

Ejemplo 6: Esperar un período y permitir que el trabajo continúe en segundo plano

Wait-Job -Name "DailyLog" -Timeout 120

Este comando espera 120 segundos (dos minutos) para que finalice el trabajo DailyLog. Si el trabajo no finaliza en los próximos dos minutos, la ejecución continúa y el trabajo continúa ejecutándose en segundo plano.

Ejemplo 7: Esperar un trabajo por nombre

Wait-Job -Name "Job3"

Este comando usa el nombre del trabajo para identificar el trabajo para el que se va a esperar.

Ejemplo 8: Esperar trabajos en el equipo local iniciado con Start-Job

$j = Start-Job -ScriptBlock {Get-ChildItem -Filter *.ps1| Where-Object {$PSItem.LastWriteTime -gt ((Get-Date) - (New-TimeSpan -Days 7))}}
$j | Wait-Job

En este ejemplo se muestra cómo usar el Wait-Job cmdlet con trabajos iniciados en el equipo local mediante Start-Job.

Estos comandos inician un trabajo que obtiene los archivos de script de Windows PowerShell que se agregaron o actualizaron en la última semana.

El primer comando usa Start-Job para iniciar un trabajo en el equipo local. El trabajo ejecuta un Get-ChildItem comando que obtiene todos los archivos que tienen una extensión de nombre de archivo .ps1 que se agregaron o actualizaron en la semana pasada.

El tercer comando usa Wait-Job para esperar hasta que el trabajo esté en un estado de terminación. Cuando finalice el trabajo, el comando muestra el objeto de trabajo, que contiene información sobre el trabajo.

Ejemplo 9: Esperar a que se inicien trabajos en equipos remotos mediante Invoke-Command

$s = New-PSSession -ComputerName Server01, Server02, Server03
$j = Invoke-Command -Session $s -ScriptBlock {Get-Process} -AsJob
$j | Wait-Job

En este ejemplo se muestra cómo usar Wait-Job con trabajos iniciados en equipos remotos mediante el parámetro AsJob de Invoke-Command. Al usar AsJob, el trabajo se crea en el equipo local y los resultados se devuelven automáticamente al equipo local, aunque el trabajo se ejecute en los equipos remotos.

En este ejemplo se usa Wait-Job para determinar si un Get-Process comando que se ejecuta en las sesiones de tres equipos remotos está en un estado de terminación.

El primer comando crea objetos PSSession en tres equipos y los almacena en la $s variable .

El segundo comando usa Invoke-Command para ejecutarse Get-Process en cada una de las tres sesiones de $s. El comando usa el parámetro AsJob para ejecutar el comando de forma asincrónica como trabajo. El comando devuelve un objeto de trabajo, al igual que los trabajos iniciados mediante Start-Joby el objeto de trabajo se almacena en la $j variable .

El tercer comando usa un operador de canalización (|) para enviar el objeto de trabajo al $jWait-Job cmdlet . En Invoke-Command este caso, no es necesario un comando porque el trabajo reside en el equipo local.

Ejemplo 10: Esperar un trabajo que tenga un identificador

Get-Job

Id   Name     State      HasMoreData     Location             Command
--   ----     -----      -----------     --------             -------
1    Job1     Completed  True            localhost,Server01.. get-service
4    Job4     Completed  True            localhost            dir | where

Wait-Job -Id 1

Este comando espera al trabajo con un valor de identificador 1.

Parámetros

-Any

Indica que este cmdlet devuelve el objeto de trabajo y continúa la ejecución cuando finaliza cualquier trabajo. De forma predeterminada, Wait-Job espera hasta que se completen todos los trabajos especificados antes de que muestre el símbolo del sistema.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Filter

Especifica una tabla hash de condiciones. Este cmdlet espera a que los trabajos cumplan todas las condiciones de la tabla hash. Especifique una tabla hash donde las claves sean propiedades de una tarea y los valores sean valores de propiedad de la tarea.

Este parámetro solo funciona en tipos de trabajo personalizados, como trabajos de flujo de trabajo y trabajos programados. No funciona en trabajos estándar, como los creados mediante el Start-Job cmdlet . Para información sobre la compatibilidad para este parámetro, vea el tema de ayuda para el tipo de trabajo.

Este parámetro se incorporó en Windows PowerShell 3.0.

Type:Hashtable
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Force

Indica que este cmdlet sigue esperando trabajos en estado Suspendido o Desconectado. De forma predeterminada, Wait-Job devuelve o finaliza la espera, cuando los trabajos se encuentran en uno de los estados siguientes:

  • Completed
  • Errónea
  • Detenido
  • Suspended
  • Escenario desconectado

Este parámetro se incorporó en Windows PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Id

Especifica una matriz de identificadores de trabajos para los que espera este cmdlet.

El identificador es un entero que identifica de forma única el trabajo en la sesión actual. Es más fácil recordar y escribir que el identificador de instancia, pero solo es único en la sesión actual. Puede escribir uno o varios identificadores, separados por comas. Para buscar el identificador de un trabajo, escriba Get-Job.

Type:Int32[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-InstanceId

Especifica una matriz de identificadores de instancia de trabajos para los que espera este cmdlet. El valor predeterminado es todas las tareas.

Un identificador de instancia es un GUID que identifica de forma única la tarea en el equipo. Para buscar el identificador de instancia de un trabajo, use Get-Job.

Type:Guid[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Job

Especifica los trabajos para los que espera este cmdlet. Escriba una variable que contenga los objetos de trabajo o un comando que obtenga los objetos de trabajo. También puede usar un operador de canalización para enviar objetos de trabajo al Wait-Job cmdlet . De forma predeterminada, Wait-Job espera todos los trabajos creados en la sesión actual.

Type:Job[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Name

Especifica los nombres descriptivos de los trabajos para los que espera este cmdlet.

Type:String[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-State

Especifica un estado de trabajo. Este cmdlet espera solo los trabajos en el estado especificado. Los valores permitidos para este parámetro son los siguientes:

  • NotStarted
  • En ejecución
  • Completed
  • Errónea
  • Detenido
  • Bloqueado
  • Suspended
  • Escenario desconectado
  • Suspendiendo
  • Deteniéndose

Para obtener más información sobre los estados de trabajo, vea JobState (enumeración).

Type:JobState
Accepted values:NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Timeout

Especifica el tiempo de espera máximo para cada trabajo, en segundos. El valor predeterminado, -1, indica que el cmdlet espera hasta que finalice el trabajo. El tiempo se inicia al enviar el Wait-Job comando, no el Start-Job comando .

Si se supera este tiempo, la espera finaliza y la ejecución continúa, aunque el trabajo siga ejecutándose. El comando no muestra ningún mensaje de error.

Type:Int32
Aliases:TimeoutSec
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Entradas

System.Management.Automation.RemotingJob

Puede canalizar un objeto de trabajo a este cmdlet.

Salidas

System.Management.Automation.PSRemotingJob

Este cmdlet devuelve objetos de trabajo que representan los trabajos en un estado de terminación. Si finaliza la espera porque se supera el valor del parámetro Timeout , Wait-Job no devuelve ningún objeto.

Notas

Windows PowerShell incluye los siguientes alias para Wait-Job:

  • wjb

De forma predeterminada, Wait-Job devuelve o finaliza la espera, cuando los trabajos se encuentran en uno de los estados siguientes:

  • Completed
  • Errónea
  • Detenido
  • Suspended
  • Escenario desconectado

Para dirigir Wait-Job a continuar esperando trabajos suspendidos y desconectados, use el parámetro Force .