TEMA
    about_Jobs

DESCRIPCIÓN BREVE
    Proporciona información sobre cómo los trabajos de segundo plano 
    de Windows PowerShell ejecutan un comando o expresión en segundo 
    plano sin interactuar con la sesión actual. 

DESCRIPCIÓN DETALLADA
    En este tema se explica cómo ejecutar los trabajos de segundo 
    plano en Windows PowerShell en un equipo local. Para obtener más 
    información sobre cómo se ejecutan los trabajos de segundo plano 
    en equipos remotos, vea about_Remote_Jobs. 
    
    Cuando se inicia un trabajo de segundo plano, el símbolo del 
    sistema vuelve inmediatamente, aunque el trabajo tarde un tiempo 
    prolongado en completarse. Puede continuar trabajando en la sesión sin 
    interrupción mientras el trabajo se ejecuta. 

    Importante: los trabajos de segundo plano que se inician mediante 
    Start-Job o el parámetro AsJob de Invoke-Command se basan en la 
    infraestructura de comunicación remota de Windows PowerShell. Para 
    usar estas características, Windows PowerShell debe estar configurado 
    para la comunicación remota, aunque el trabajo de segundo plano 
    se ejecute solamente en el equipo local. Para obtener más información, 
    vea about_Remote_Requirements.

 
        
 CÓMO INICIAR UN TRABAJO EN EL EQUIPO LOCAL
    Para iniciar un trabajo de segundo plano en un equipo local, se 
    utiliza el cmdlet Start-Job. 

    Para escribir un comando Start-Job, el comando que el trabajo 
    ejecuta debe ir entre llaves ( { } ). Use el parámetro 
    ScriptBlock para especificar el comando.

    El comando siguiente inicia un trabajo de segundo plano que 
    ejecuta un comando Get-Process en el equipo local.

        start-job -scriptblock {get-process}


    El comando Start-Job devuelve un objeto que representa el 
    trabajo. El objeto de trabajo contiene información útil sobre el 
    trabajo, pero no contiene los resultados del mismo.
    
    Guarde el objeto de trabajo en una variable y, a continuación, 
    utilícelo con los demás cmdlets Job administrar el trabajo de 
    segundo plano. El comando siguiente inicia un objeto de trabajo y 
    guarda el objeto de trabajo resultante en la variable $job.

        $job = start-job -scriptblock {get-process} 

    También se puede utilizar el cmdlet Get-Job para obtener objetos que 
    representan los trabajos iniciado en la sesión actual. Get-Job 
    devuelve el mismo objeto de trabajo que Start-Job.

 
 OBTENER OBJETOS DE TRABAJO

    Para obtener objetos que representan los trabajos de segundo 
    plano que se han iniciado en la sesión actual, se utiliza el 
    cmdlet Get-Job. Sin parámetros, Get-Job devuelve todos los 
    trabajos que se han iniciado en la sesión actual.

    Por ejemplo, el comando siguiente obtiene los trabajos de la 
    sesión actual.

	get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Running    True         localhost  get-process


    También se puede guardar el objeto de trabajo en una variable y 
    utilizarlo para representar el trabajo en un comando posterior. 
    El comando siguiente obtiene el trabajo cuyo identificador es 1 y 
    lo guarda en la variable $job.

       $job = get-job -id 1 


    El objeto de trabajo contiene el estado del trabajo, que indica 
    si el trabajo ha finalizado. Un trabajo finalizado tiene el 
    estado "Complete" o "Failed". Un trabajo también puede estar bloqueado 
    (Blocked) o en ejecución (Running).


	get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete   True         localhost  get-process




 OBTENER LOS RESULTADOS DE UN TRABAJO

    Cuando se ejecuta un trabajo de segundo plano, los resultados no 
    aparecen inmediatamente. En lugar de ello, el cmdlet Start-Job 
    devuelve un objeto de trabajo que representa el trabajo, pero no 
    contiene sus resultados. Para obtener los resultados de un 
    trabajo de segundo plano, se usa el cmdlet Receive-Job.

    El comando siguiente utiliza el cmdlet Receive-Job para obtener 
    los resultados del trabajo. Utiliza un objeto de trabajo guardado 
    en la variable $job para identificar el trabajo.

	receive-job -job $job

     El cmdlet Receive-Job devuelve los resultados del trabajo. 


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

     También se pueden guardar los resultados de un trabajo en una 
     variable. El comando siguiente guarda en la variable $results 
     los resultados del trabajo contenido en la variable $job.

	$results = receive-job -job $job

     Además, los resultados del trabajo se pueden guardar en un archivo mediante 
     el operador de redirección (>) o el cmdlet Out-File. El comando siguiente 
     utiliza el operador de redirección para guardar en el archivo Results.txt 
     los resultados del trabajo contenido en la variable $job.


        receive-job -job $job > results.txt


    

 OBTENER Y MANTENER RESULTADOS PARCIALES DE UN TRABAJO

    El cmdlet Receive-Job devuelve los resultados de un trabajo de 
    segundo plano. Si el trabajo se ha completado, Receive-Job 
    devuelve los resultados completos del trabajo. Si el trabajo 
    todavía se está ejecutando, Receive-Job obtiene los resultados 
    que se han generado hasta ahora. Los comandos Receive-Job se 
    pueden ejecutar de nuevo para obtener los resultados restantes.

    Cuando Receive-Job devuelve resultados, elimina de forma 
    predeterminada los resultados de la memoria caché donde se 
    almacenan los resultados de los trabajos. Si se ejecuta otro 
    comando Receive-Job, solamente se obtienen los resultados que no 
    se hayan recibido todavía.

    Los comandos siguientes muestran los resultados de comandos 
    Receive-Job ejecutados antes de que el trabajo se haya completado.


	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


    Para evitar que Receive-Job elimine los resultados que ha 
    devuelto de un trabajo, se utiliza el parámetro Keep. Así, Receive-Job 
    devolverá todos los resultados generados hasta ese momento.

    Los comandos siguientes muestran el efecto de utilizar el 
    parámetro Keep en un trabajo que no se ha completado todavía. 

	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


    
ESPERAR A LOS RESULTADOS

    Si se ejecuta un comando que tarda mucho tiempo en completarse, 
    se pueden utilizar las propiedades del objeto de trabajo para 
    determinar cuándo se completa el trabajo. El comando siguiente 
    utiliza el objeto Get-Job para obtener todos los trabajos de 
    segundo plano de la sesión actual.

	get-job

    Los resultados aparecen en una tabla. El estado del trabajo 
    aparece en la columna State.

        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process
        2   Job2  Running     True         localhost  get-eventlog -log syst...
        3   Job3  Complete    True         localhost  dir -path c:\* -recurse


    En este caso, la propiedad State revela que el trabajo 2 sigue 
    ejecutándose. Si se usara el cmdlet Receive-Job ahora para obtener los 
    resultados del trabajo, estarían incompletos. El cmdlet Receive-Job 
    se puede usar repetidamente para obtener todos los resultados. 
    De forma predeterminada, cada vez que se utiliza, se obtienen solamente los 
    resultados que todavía no se han recibido; sin embargo, es posible 
    utilizar el parámetro Keep del cmdlet Receive-Job para conservar los 
    resultados aunque ya se hayan recibido.

    En este punto, se pueden escribir los resultados en un archivo y, a 
    continuación, anexarle los resultados nuevos a medida que se reciban. 
    También se puede esperar y comprobar el estado del trabajo más adelante.

    Otra opción es utilizar el cmdlet Wait-Job para esperar a alguno 
    o todos los resultados del trabajo. Wait-Job permite esperar a que se 
    completen todos los trabajos, uno determinado o cualquiera de ellos.
  
    El comando siguiente utiliza el cmdlet Wait-Job para esperar al 
    trabajo cuyo identificador es 10.

	wait-job -ID 10

    En consecuencia, el símbolo del sistema de Windows PowerShell se 
    suprime hasta que el trabajo se completa.

    También se puede esperar durante un período de tiempo 
    predeterminado. Este comando utiliza el parámetro Timeout para 
    limitar la espera a 120 segundos. Cuando ha transcurrido ese 
    tiempo, vuelve a mostrarse el símbolo del sistema, pero el 
    trabajo continúa ejecutándose en segundo plano.

	wait-job -ID 10 -timeout 120


DETENER UN TRABAJO

    Para detener un trabajo de segundo plano, se utiliza el cmdlet 
    Stop-Job. El comando siguiente inicia un trabajo para obtener 
    todas las entradas del registro de eventos del sistema. Guarda el 
    objeto de trabajo en la variable $job.

	$job = start-job -scriptblock {get-eventlog -log system} 

    El comando siguiente detiene el trabajo. Utiliza un operador de 
    canalización (|) para enviar el trabajo contenido en la variable 
    $job a Stop-Job.

	$job | stop-job


ELIMINAR UN TRABAJO

    Para eliminar un trabajo de segundo plano, se utiliza el cmdlet 
    Remove-Job. El comando siguiente elimina el objeto de trabajo 
    contenido en la variable $job.

	remove-job -job $job 


INVESTIGAR UN TRABAJO QUE PRODUJO UN ERROR

    Para averiguar por qué se produjo un error en un trabajo, se 
    utiliza la subpropiedad Reason del objeto de trabajo.

    El comando siguiente inicia un trabajo sin las credenciales 
    necesarias. Guarda el objeto de trabajo en la variable $job.


         $job = start-job -scriptblock {new-item -path HKLM:\Software\MiEmpresa}

         Id   Name  State    HasMoreData  Location   Command
         --   ----  -----    -----------  --------   -------
         1    Job1  Failed   False        localhost  new-item -path HKLM:\S...


    El comando siguiente utiliza la propiedad Reason para buscar el 
    error que ha provocado el error en el trabajo.

         $job.ChildJobs[0].JobStateInfo.Reason


    En este caso, el error en el trabajo se ha producido porque 
    equipo remoto exigía credenciales explícitas para ejecutar el 
    comando. El valor de la propiedad Reason es:

         Error de conexión al servidor remoto. Mensaje de error: 
         Acceso denegado.


CMDLETS JOB

    Start-Job        Inicia un trabajo de segundo plano en un equipo local.

    Get-Job          Obtiene todos los trabajos de segundo plano que se han 
                     iniciado en la sesión actual.

    Receive-Job      Obtiene los resultados de los trabajos de segundo plano.

    Stop-Job         Detiene un trabajo de segundo plano.

    Wait-Job         Suprime el símbolo del sistema hasta que uno o todos 
                     los trabajos se han completado.

    Remove-Job       Elimina un trabajo de segundo plano.

    Invoke-Command   El parámetro AsJob ejecuta cualquier comando como un trabajo 
                     de segundo plano en un equipo remoto. También se puede 
                     utilizar Invoke-Command para ejecutar cualquier comando Job 
                     remotamente, incluso un comando Start-Job.

 
VEA TAMBIÉN
   about_Remote_Jobs
   about_Job_Details
   about_Remote
   about_PSSessions  
   Start-Job
   Get-Job
   Receive-Job
   Stop-Job
   Wait-Job
   Remove-Job
   Invoke-Command




Tabla de contenido