about_Remote_Jobs

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

TEMA

about_Remote_Jobs

DESCRIPCIÓN BREVE

Describe cómo ejecutar trabajos en segundo plano en equipos remotos.

DESCRIPCIÓN DETALLADA

Un trabajo en segundo plano es un comando que se ejecuta de forma asincrónica sin interactuar con la sesión actual. El símbolo del sistema se devuelve inmediatamente y puede seguir usando la sesión mientras se ejecuta el trabajo.

De forma predeterminada, los trabajos en segundo plano se ejecutan en el equipo local. Sin embargo, puede usar varios procedimientos diferentes para ejecutar trabajos en segundo plano en equipos remotos.

En este tema se explica cómo ejecutar un trabajo en segundo plano en un equipo remoto. Para obtener información sobre cómo ejecutar trabajos en segundo plano en un equipo local, consulte about_Jobs. Para más información sobre los trabajos en segundo plano, consulte about_Job_Details.

TRABAJOS EN SEGUNDO PLANO REMOTOS

Puede ejecutar trabajos en segundo plano en equipos remotos empleando tres métodos diferentes.

-- Iniciar una sesión interactiva con un equipo remoto e iniciar un trabajo en la sesión interactiva. Los procedimientos son los mismos que al ejecutar un trabajo local, aunque todas las acciones se realizan en el equipo remoto.

-- Ejecutar un trabajo en segundo plano en un equipo remoto que devuelve los resultados al equipo local. Use este método cuando desee recopilar los resultados de los trabajos en segundo plano y conservarlos en una ubicación central en el equipo local.

-- Ejecutar un trabajo en segundo plano en un equipo remoto que conserva los resultados en el equipo remoto. Use este método cuando los datos del trabajo se conservan más seguros en el equipo de origen.

INICIAR UN TRABAJO EN SEGUNDO PLANO EN UNA SESIÓN INTERACTIVA

Puede iniciar una sesión interactiva con un equipo remoto y, a continuación, iniciar un trabajo en segundo plano durante la sesión interactiva. Para obtener más información sobre las sesiones interactivas, vea about_Remote y Enter-PSSession.

El procedimiento para iniciar un trabajo en segundo plano en una sesión interactiva es casi idéntico al procedimiento para iniciar un trabajo en segundo plano en el equipo local. Sin embargo, todas las operaciones tienen lugar en el equipo remoto, no en el equipo local.

PASO 1: ENTER-PSSESSION

Use el cmdlet Enter-PSSession para iniciar una sesión interactiva con un equipo remoto. Puede usar el parámetro ComputerName de Enter-PSSession para establecer una conexión temporal para la sesión interactiva. También puede usar el parámetro Session para ejecutar la sesión interactiva en una sesión de Windows PowerShell® (PSSession).

El comando siguiente inicia una sesión interactiva en el equipo Server01.

        C:\PS> Enter-PSSession -computername Server01

El símbolo del sistema cambia para mostrar que ahora está conectado al equipo Server01.

        Server01\C:>

PASO 2: START-JOB

Para iniciar un trabajo en segundo plano en la sesión, use el cmdlet Start-Job.

El comando siguiente ejecuta un trabajo en segundo plano que obtiene los eventos del registro de eventos de Windows PowerShell en el equipo Server01. El cmdlet Start-Job devuelve un objeto que representa el trabajo.

Este comando guarda el objeto de trabajo en la variable $job.

        Server01\C:> $job = start-job -scriptblock {get-eventlog "Windows PowerShell"}

Mientras se ejecuta el trabajo, puede usar la sesión interactiva para ejecutar otros comandos, incluidos otros trabajos en segundo plano. Sin embargo, se debe mantener la sesión interactiva abierta hasta que se complete el trabajo. Si finaliza la sesión, el trabajo se interrumpe y los resultados se pierden.

PASO 3: GET-JOB

Para averiguar si el trabajo está completo, muestre el valor de la variable $job o use el cmdlet Get-Job para obtener el trabajo. El comando siguiente usa el cmdlet Get-Job para mostrar el trabajo.

        Server01\C:> get-job $job

        SessionId  Name  State      HasMoreData  Location   Command
        ---------  ----  -----      -----------  --------   -------
        1          Job1  Complete   True         localhost  get-eventlog "Windows PowerShell"

La salida de Get-Job muestra que el trabajo se ejecuta en el equipo "localhost" porque el trabajo se inició y se ejecuta en el mismo equipo (en este caso, Server01).

PASO 4: RECEIVE-JOB

Para obtener los resultados del trabajo, use el cmdlet Receive-Job. Puede mostrar los resultados en la sesión interactiva o guardarlos en un archivo en el equipo remoto. El comando siguiente obtiene los resultados del trabajo en la variable $job. El comando usa el operador de redirección (>) para guardar los resultados del trabajo en el archivo PsLog.txt del equipo Server01.

        Server01\C:> receive-job $job > c:\logs\PsLog.txt

PASO 5: EXIT-PSSESSION

Para finalizar la sesión interactiva, use el cmdlet Exit-PSSession. El símbolo del sistema cambia para mostrar que se encuentra de nuevo en la sesión original en el equipo local.

        Server01\C:> Exit-PSSession
        C:\PS>

PASO 6: INVOKE-COMMAND: GET-CONTENT

Para ver el contenido del archivo PsLog.txt en el equipo Server01 en cualquier momento, inicie otra sesión interactiva o ejecute un comando remoto. Este tipo de comando se ejecuta mejor en una PSSession (una conexión persistente) en caso de que desee usar varios comandos para investigar y administrar los datos en el archivo PsLog.txt. Para más información sobre las PSSession, consulte about_PSSessions.

Los comandos siguientes usan el cmdlet New-PSSession para crear una PSSession que está conectada al equipo Server01 y usan el cmdlet Invoke-Command para ejecutar un comando Get-Content en la PSSession para ver el contenido del archivo.

        C:\PS> $s = new-pssession -computername Server01
        C:\PS> invoke-command -session $s -scriptblock {get-content c:\logs\pslog.txt}

INICIAR UN TRABAJO REMOTO QUE DEVUELVE LOS RESULTADOS AL EQUIPO LOCAL (ASJOB)

Para iniciar un trabajo en segundo plano en un equipo remoto que devuelve los resultados del comando al equipo local, use el parámetro AsJob de un cmdlet como Invoke-Command.

Cuando use el parámetro AsJob, el objeto de trabajo se crea en el equipo local, aunque el trabajo se ejecute en el equipo remoto. Cuando se completa el trabajo, los resultados se devuelven al equipo local.

Puede usar los cmdlets que contienen el nombre Job (los cmdlets Job) para administrar cualquier trabajo creado por cualquier cmdlet. Muchos de los cmdlets que tienen parámetros AsJob no usan la comunicación remota de Windows PowerShell, por lo que pueden usarse incluso en equipos que no están configurados para la comunicación remota y que no cumplen sus requisitos.

PASO 1: INVOKE-COMMAND -ASJOB

El siguiente comando usa el parámetro AsJob de Invoke-Command para iniciar un trabajo en segundo plano en el equipo Server01. El trabajo ejecuta un comando Get-Eventlog que obtiene los eventos en el registro del sistema. Puede usar el parámetro JobName para asignar un nombre para mostrar al trabajo.

       invoke-command -computername Server01 -scriptblock {get-eventlog system} -asjob  

Los resultados del comando se parecen a la siguiente salida de ejemplo.

       SessionId   Name    State      HasMoreData     Location   Command
       ---------   ----    -----      -----------     --------   -------
       1           Job1    Running    True            Server01   get-eventlog system

Cuando se usa el parámetro AsJob, Invoke-Command devuelve el mismo tipo de objeto de trabajo que Start-Job devuelve. Puede guardar el objeto de trabajo en una variable, o bien puede usar un comando Get-Job para obtener el trabajo.

Tenga en cuenta que el valor de la propiedad Location muestra que el trabajo se ejecutó en el equipo Server01.

PASO 2: GET-JOB

Para administrar un trabajo iniciado mediante el parámetro AsJob del cmdlet Invoke-Command, use los cmdlets Job. Dado que el objeto de trabajo que representa el trabajo remoto se encuentra en el equipo local, no es necesario ejecutar comandos remotos para administrar el trabajo.

Para determinar si el trabajo se completó, use un comando Get-Job. El comando siguiente obtiene todos los trabajos que se iniciaron en la sesión actual.

        get-job

Dado que el trabajo remoto se inició en la sesión actual, un comando Get-Job local obtiene el trabajo. La propiedad State del objeto de trabajo muestra que el comando se completó correctamente.

       SessionId   Name   State      HasMoreData     Location   Command
       ---------   ----   -----      -----------     --------   -------
       1           Job1   Completed  True            Server01   get-eventlog system

PASO 3: RECEIVE-JOB

Para obtener los resultados del trabajo, use el cmdlet Receive-Job. Dado que los resultados del trabajo se devuelven automáticamente al equipo donde reside el objeto de trabajo, puede obtener los resultados con un comando Receive-Job local.

El comando siguiente usa el cmdlet Receive-Job para obtener los resultados del trabajo. Usa el identificador de sesión para identificar el trabajo. Este comando guarda los resultados del trabajo en la variable $results. También puede redirigir los resultados a un archivo.

       $results = receive-job -id 1

INICIAR UN TRABAJO REMOTO QUE CONSERVA LOS RESULTADOS EN EL EQUIPO REMOTO

Para iniciar un trabajo en segundo plano en un equipo remoto que conserve los resultados del comando en el equipo remoto, use el cmdlet Invoke-Command para ejecutar un comando Start-Job en un equipo remoto. Puede usar este método para ejecutar trabajos en segundo plano en varios equipos.

Al ejecutar un comando Start-Job de forma remota, el objeto de trabajo se crea en el equipo remoto y los resultados del trabajo se conservan en el equipo remoto. En lo que respecta al trabajo, todas las operaciones son locales. Los comandos se ejecutan de forma remota simplemente para administrar un trabajo local en el equipo remoto.

PASO 1: INVOKE-COMMAND START-JOB

Use el cmdlet Invoke-Command para ejecutar un comando Start-Job en un equipo remoto.

Este comando requiere una PSSession (una conexión persistente). Si usa el parámetro ComputerName de Invoke-Command para establecer una conexión temporal, se considera que el comando Invoke-Command se completa cuando se devuelve el objeto de trabajo. Como resultado, se cierra la conexión temporal y se cancela el trabajo.

El comando siguiente usa el cmdlet New-PSSession para crear una PSSession que está conectada al equipo Server01. El comando guarda la PSSession en la variable $s.

        $s = new-pssession -computername Server01

El comando siguiente usa el cmdlet Invoke-Command para ejecutar un comando Start-Job en la PSSession. El comando Start-Job y Get-Eventlog se encierran entre llaves.

       invoke-command -session $s -scriptblock {start-job -scriptblock {get-eventlog system}}

Los resultados se parecen a la siguiente salida de ejemplo.

       Id       Name    State      HasMoreData     Location   Command
       --       ----    -----      -----------     --------   -------
       2        Job2    Running    True            Localhost  get-eventlog system

Cuando ejecuta un comando Start-Job de forma remota, Invoke-Command devuelve el mismo tipo de objeto de trabajo que Start-Job devuelve. Puede guardar el objeto de trabajo en una variable, o bien puede usar un comando Get-Job para obtener el trabajo.

Tenga en cuenta que el valor de la propiedad Location muestra que el trabajo se ejecutó en el equipo local, denominado "LocalHost", aunque el trabajo se ejecutó en el equipo Server01. Dado que el objeto de trabajo se creó en el equipo Server01 y el trabajo se ejecuta en el mismo equipo, se considera un trabajo en segundo plano local.

PASO 2: INVOKE-COMMAND GET-JOB

Para administrar un trabajo en segundo plano remoto, use los cmdlets Job. Dado que el objeto de trabajo se encuentra en el equipo remoto, deberá ejecutar comandos remotos para obtener, detener, esperar o recuperar los resultados del trabajo.

Para comprobar si el trabajo se completó, use un comando Invoke-Command para ejecutar un comando Get-Job en la PSSession que está conectada al equipo Server01.

        invoke-command -session $s -scriptblock {get-job}

El comando devuelve un objeto de trabajo. La propiedad State del objeto de trabajo muestra que el comando se completó correctamente.

       SessionId       Name    State      HasMoreData     Location   Command
       ---------       ----    -----      -----------     --------   -------
       2               Job2    Completed  True            LocalHost   get-eventlog system

PASO 3: INVOKE-COMMAND RECEIVE-JOB

Para obtener los resultados del trabajo, use el cmdlet Invoke-Command para ejecutar un comando Receive-Job en la PSSession que está conectada al equipo Server01.

El comando siguiente usa el cmdlet Receive-Job para obtener los resultados del trabajo. Usa el identificador de sesión para identificar el trabajo. Este comando guarda los resultados del trabajo en la variable $results. Usa el parámetro Keep de Receive-Job para conservar el resultado en la caché de trabajos en el equipo remoto.

        $results = invoke-command -session $s -scriptblock {receive-job -sessionid 2 -keep}

También puede redirigir los resultados a un archivo en el equipo local o remoto. El comando siguiente usa un operador de redirección para guardar los resultados en un archivo en el equipo Server01.

        invoke-command -session $s -command {receive-job -sessionid 2 > c:\logs\pslog.txt}

VEA TAMBIÉN

about_Jobs

about_Job_Details

about_Remote

about_Remote_Variables

Invoke-Command

Start-Job

Get-Job

Wait-Job

Stop-Job

Remove-Job

New-PSSession

Enter-PSSession

Exit-PSSession