about_Scheduled_Jobs_Troubleshooting

Se aplica a: Windows PowerShell 3.0

TEMA

about_Scheduled_Jobs_Troubleshooting

DESCRIPCIÓN BREVE

Explica cómo resolver problemas relacionados con los trabajos programados.

DESCRIPCIÓN LARGA

En esta sección se describen algunos de los problemas que pueden surgir al usar las características del trabajo programado de Windows PowerShell®, y se sugieren soluciones para estos problemas.

Antes de usar los trabajos programados de Windows PowerShell, consulte about_Scheduled_Jobs y los temas About relacionados con los trabajos programados.

Este tema contiene las siguientes secciones:

  • -- NO SE PUEDE ENCONTRAR LOS RESULTADOS DEL TRABAJO

  • -- EL TRABAJO PROGRAMADO NO SE EJECUTA

  • -- NO SE PUEDE OBTENER EL TRABAJO PROGRAMADO: EL TRABAJO PROGRAMADO ESTÁ DAÑADO

  • -- LOS CMDLETS JOB NO PUEDEN ENCONTRAR DE FORMA SISTEMÁTICA LOS TRABAJOS PROGRAMADOS

NO SE PUEDEN ENCONTRAR LOS RESULTADOS DEL TRABAJO

  • -- Método básico para obtener los resultados del trabajo en Windows PowerShell

    Cuando se ejecuta un trabajo programado, crea una "instancia" del trabajo programado. Para ver, administrar y obtener los resultados de las instancias de trabajos programados, use los cmdlets Job.

    NOTA: Para usar los cmdlets Job en instancias de trabajos programados, se debe importar en la sesión el módulo PSScheduledJob. Para importar el módulo PSScheduledJob, escriba "Import-Module PSScheduledJob" (sin las comillas) o use cualquier cmdlet ScheduledJob, como Get-ScheduledJob.

    Para obtener una lista de todas las instancias de un trabajo programado, use el cmdlet Get-Job.

               PS C:\> Import-Module PSScheduledJob
               PS C:\> Get-Job ProcessJob
    
               Id     Name         PSJobTypeName   State         HasMoreData     Location
               --     ----         -------------   -----         -----------     --------
               43     ProcessJob   PSScheduledJob  Completed     False           localhost            
               44     ProcessJob   PSScheduledJob  Completed     False           localhost
               45     ProcessJob   PSScheduledJob  Completed     False           localhost           
               46     ProcessJob   PSScheduledJob  Completed     False           localhost
               47     ProcessJob   PSScheduledJob  Completed     False           localhost
               48     ProcessJob   PSScheduledJob  Completed     False           localhost
               49     ProcessJob   PSScheduledJob  Completed     False           localhost
               50     ProcessJob   PSScheduledJob  Completed     False           localhost
    

    El comando siguiente usa el cmdlet Format-Table para mostrar las propiedades Name, ID y PSBeginTime de una instancia de trabajo programado en una tabla.

               PS C:\> Get-Job ProcessJob | Format-Table -Property Name, ID, PSBeginTime -Auto
    
               Name       Id PSBeginTime
               ----       -- ---------
               ProcessJob 43 11/2/2011 3:00:02 AM
               ProcessJob 44 11/3/2011 3:00:02 AM
               ProcessJob 45 11/4/2011 3:00:02 AM
               ProcessJob 46 11/5/2011 3:00:02 AM
               ProcessJob 47 11/6/2011 3:00:02 AM
               ProcessJob 48 11/7/2011 12:00:01 AM
               ProcessJob 49 11/7/2011 3:00:02 AM
               ProcessJob 50 11/8/2011 3:00:02 AM
    

    Para obtener los resultados de una instancia de trabajo programado, use el cmdlet Receive-Job. El comando siguiente obtiene los resultados de la instancia más reciente de ProcessJob (ID = 50).

               PS C:\> Receive-Job -ID 50
    
  • -- Método básico para encontrar los resultados del trabajo en disco

    Para administrar trabajos programados, use los cmdlets Job, como Get-Job y Receive-Job.

    Si Get-Job no obtiene la instancia de trabajo o si Receive-Job no obtiene los resultados del trabajo, puede buscar los archivos del historial de ejecución del trabajo en el disco. El historial de ejecución contiene un registro de todas las instancias de trabajos desencadenadas.

    Compruebe que existe un directorio con nombre de marca de tiempo en el directorio de un trabajo programado en la ruta de acceso siguiente:

            $home\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob
                 \<ScheduledJobName>\Output
    

    Por lo general:

            C:\Users\<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob
              \<ScheduledJobName>\Output
    

    Por ejemplo, el comando siguiente obtiene el historial de ejecución en el disco del trabajo programado ProcessJob.

            PS C:\> dir $home\AppData\Local\Microsoft\Windows\PowerShell
                    \ScheduledJobs\ProcessJob\Output
    
            Directory: C:\Users\User01\AppData\Local\Microsoft\Windows\PowerShell
                         \ScheduledJobs\ProcessJob\Output
    
            Mode                LastWriteTime     Length Name
            ----                -------------     ------ ----
            d----         11/2/2011   3:00 AM            20111102-030002-260
            d----         11/3/2011   3:00 AM            20111103-030002-277
            d----         11/4/2011   3:00 AM            20111104-030002-209
            d----         11/5/2011   3:00 AM            20111105-030002-251
            d----         11/6/2011   3:00 AM            20111106-030002-174
            d----         11/7/2011  12:00 AM            20111107-000001-914
            d----         11/7/2011   3:00 AM            20111107-030002-376
    

    Cada directorio con nombre de marca de tiempo representa una instancia de trabajo. Los resultados de cada instancia de trabajo se guardan en un archivo Results.xml en el directorio con nombre de marca de tiempo.

    Por ejemplo, el comando siguiente obtiene los archivos Results.xml de cada instancia guardada del trabajo programado ProcessJob.

            PS C:\> dir $home\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs
                             \ProcessJob\Output\*\Results.xml
    
            Directory: C:\Users\User01\Appdata\Local\Microsoft\Windows\PowerShell
                         \ScheduledJobs\ProcessJob\Output
    

    Si falta el archivo Results.xml, Windows PowerShell no puede devolver o mostrar los resultados del trabajo.

  • -- Es posible que el cmdlet Job no pueda obtener instancias de trabajos programados o sus resultados porque el módulo PSScheduledJob no se importó en la sesión.

    NOTA: Antes de usar un cmdlet Job en las instancias de trabajos programados, compruebe que el módulo PSScheduledJob está incluido en la sesión. Sin el módulo, los cmdlets Job no pueden obtener instancias de trabajos programados o sus resultados.

    Para importar el módulo PSScheduledJob, escriba:

               Import-Module PSScheduledJob
    
  • -- Puede que el cmdlet Receive-Job ya haya devuelto los resultados en la sesión actual.

    Si Receive-Job no devuelve resultados de la instancia de trabajo, podría deberse a que se ejecutó un comando Receive-Job para esa instancia de trabajo en la sesión actual sin el parámetro Keep.

    Cuando Receive-Job se usa sin el parámetro Keep, Receive-Job devuelve los resultados del trabajo y establece la propiedad HasMoreData de la instancia de trabajo en False para indicar que devolvió todos los resultados de la instancia de trabajo y que no hay más resultados que devolver. Esta configuración es adecuada para los trabajos en segundo plano estándar, pero no para las instancias de trabajos programados, que se guardan en disco.

    Para volver a obtener los resultados de la instancia de trabajo, inicie una nueva sesión de Windows PowerShell (escriba "PowerShell" sin las comillas), importe el módulo PSScheduledJob y pruebe de nuevo el comando Receive-Job.

               PS C:\> Receive-Job -ID 50
               PS C:\>                     #No results
               PS C:\> PowerShell
    
               Windows PowerShell
               Copyright (C) 2012 Microsoft Corporation. All rights reserved.
    
               PS C:\> Import-Module PSScheduledJob
               PS C:\> Receive-Job -ID 50 
    
               Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
               -------  ------    -----      ----- -----   ------     -- -----------
                  1213      33    12348      21676    88    25.71   1608 CcmExec
                    29       4     1168       2920    43     0.02    748 conhost
                    46       6     2208       4612    45     0.03   1640 conhost
               ...
    

    Para obtener el resultado de una instancia de trabajo más de una vez en una sesión, use el parámetro Keep del cmdlet Receive-Job.

               PS C:\> Import-Module PSScheduledJob
               PS C:\> Receive-Job -ID 50 -Keep
    
               Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
               -------  ------    -----      ----- -----   ------     -- -----------
                  1213      33    12348      21676    88    25.71   1608 CcmExec
                    29       4     1168       2920    43     0.02    748 conhost
                    46       6     2208       4612    45     0.03   1640 conhost
    
    
               PS C:\> Receive-Job -ID 50 -Keep
    
               Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
               -------  ------    -----      ----- -----   ------     -- -----------
                  1213      33    12348      21676    88    25.71   1608 CcmExec
                    29       4     1168       2920    43     0.02    748 conhost
                    46       6     2208       4612    45     0.03   1640 conhost
    
  • -- El trabajo programado podría estar dañado.

    Si un trabajo programado se daña, Windows PowerShell elimina el trabajo programado dañado y sus resultados. No se puede recuperar los resultados de un trabajo programado dañado.

    Para determinar si un trabajo programado todavía existe, use el cmdlet Get-ScheduledJob.

               PS C:\> Get-ScheduledJob   
    
  • -- El número de resultados podría haber superado el valor de ExecutionHistoryLength del trabajo programado.

    La propiedad ExecutionHistoryLength de un trabajo programado determina cuántas instancias de trabajo con sus resultados se guardan en el disco. El valor predeterminado es 32. Cuando el número de instancias de un trabajo programado supera este valor, Windows PowerShell elimina la instancia de trabajo más antigua para dejar espacio a cada nueva instancia de trabajo.

    Para obtener el valor de la propiedad ExecutionHistoryLength de un trabajo programado, use el formato de comando siguiente:

               (Get-ScheduledJob <JobName>).ExecutionHistoryLength
    

    Por ejemplo, el comando siguiente obtiene el valor de la propiedad ExecutionHistoryLength del trabajo programado ProcessJob.

               PS C:\> (Get-ScheduledJob ProcessJob).ExecutionHistoryLength
    

    Para establecer o cambiar el valor de la propiedad ExecutionHistoryLength, use el parámetro MaxResultCount de los cmdlets Register-ScheduledJob y Set-ScheduledJob.

    El comando siguiente aumenta a 50 el valor de la propiedad ExecutionHistoryLength.

               PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
    
  • -- Los resultados de la instancia de trabajo podrían haberse eliminado

    El parámetro ClearExecutionHistory del cmdlet Set-ScheduledJob elimina el historial de ejecución de un trabajo. Puede usar esta característica para liberar espacio en disco o eliminar resultados que no son necesarios, o bien que ya se usaron, se analizaron o se guardaron en una ubicación diferente.

    Para eliminar el historial de ejecución de un trabajo programado, use el parámetro ClearExecutionHistory del trabajo programado.

    El comando siguiente elimina el historial de ejecución del trabajo programado ProcessJob.

               PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
    

    Además, el cmdlet Remove-Job elimina los resultados del trabajo. Cuando se usa Remove-Job para eliminar un trabajo programado, se eliminan todas las instancias del trabajo en el disco, incluido el historial de ejecución y todos los resultados del trabajo.

  • -- Los trabajos iniciados mediante el cmdlet Start-Job no se guardan en el disco.

    Cuando se usa Start-Job para iniciar un trabajo programado, en lugar de usar un desencadenador de trabajo, Start-Job inicia un trabajo en segundo plano estándar. El trabajo en segundo plano y sus resultados no se almacenan en el historial de ejecución del trabajo en el disco.

    Puede usar el cmdlet Get-Job para obtener el trabajo y el cmdlet Receive-Job para obtener los resultados del trabajo, pero los resultados están disponibles solo hasta que se reciben, a menos que use el parámetro Keep del cmdlet Receive-Job.

    Asimismo, los trabajos en segundo plano y sus resultados son específicos de la sesión; solo existen en la sesión en la que se crean. Si elimina el trabajo (Remove-Job), cierra la sesión o cierra Windows PowerShell, la instancia de trabajo y sus resultados se eliminan.

EL TRABAJO PROGRAMADO NO SE EJECUTA

  • -- Los trabajos programados no se ejecutan automáticamente si se deshabilitan los desencadenadores de trabajo o el trabajo programado.

    Use el cmdlet Get-ScheduledJob para obtener el trabajo programado. Compruebe que el valor de la propiedad Enabled del trabajo programado es True ($true).

        PS C:\> Get-ScheduledJob ProcessJob
    
        Id         Name            Triggers        Command         Enabled
        --         ----            --------        -------         -------
        4          ProcessJob      {1, 2}          Get-Process     True
    
    
        PS C:\> (Get-ScheduledJob ProcessJob).Enabled
        True
    

    Use el cmdlet Get-JobTrigger para obtener los desencadenadores de trabajo de la tarea programada. Compruebe que el valor de la propiedad Enabled del desencadenador de trabajo es True ($true)

        PS C:\> Get-ScheduledJob ProcessJob | Get-JobTrigger
    
        Id         Frequency       Time                   DaysOfWeek              Enabled
        --         ---------       ----                   ----------              -------
        1          Weekly          11/7/2011 5:00:00 AM   {Monday, Thursday}      True
        2          Daily           11/7/2011 3:00:00 PM                           True
    
    
        PS C:\> Get-ScheduledJob ProcessJob | Get-JobTrigger | Format-Table ID, Enabled -Auto
    
        Id Enabled
        -- -------
        1    True
        2    True
    
  • -- Los trabajos programados no se ejecutan automáticamente si los desencadenadores de trabajo no son válidos.

    Por ejemplo, un desencadenador de trabajo puede especificar una fecha pasada o una fecha que no existirá, como el quinto lunes del mes.

  • -- Los trabajos programados no se ejecutan automáticamente si no se cumplen las condiciones del desencadenador de trabajo o las opciones del trabajo.

    Por ejemplo, un trabajo programado que se ejecuta solo cuando un usuario determinado inicia sesión en el equipo no se ejecutará si dicho usuario no puede iniciar sesión o solo se conecta remotamente.

    Examine las opciones del trabajo programado y asegúrese de que se cumplen. Por ejemplo, un trabajo programado que requiere una conexión de red o que el equipo esté inactivo, o bien tiene una IdleDuration larga o un IdleTimeout breve podría no ejecutarse nunca.

    Use el cmdlet Get-ScheduledJobOption para examinar las opciones del trabajo y sus valores.

           PS C:\> Get-ScheduledJob -Name ProcessJob
    
    
           StartIfOnBatteries     : False
           StopIfGoingOnBatteries : True
           WakeToRun              : True
           StartIfNotIdle         : True
           StopIfGoingOffIdle     : False
           RestartOnIdleResume    : False
           IdleDuration           : 00:10:00
           IdleTimeout            : 01:00:00
           ShowInTaskScheduler    : True
           RunElevated            : False
           RunWithoutNetwork      : True
           DoNotAllowDemandStart  : False
           MultipleInstancePolicy : IgnoreNew
           JobDefinition          : Microsoft.PowerShell.ScheduledJob.ScheduledJobDefinition
    

    Para obtener descripciones de las opciones del trabajo programado, vea el tema de ayuda del cmdlet New-ScheduledJobOption (https://go.microsoft.com/fwlink/?LinkID=223919).

  • -- Podría haberse producido un error en la instancia del trabajo programado.

    Si se produce un error en un comando del trabajo programado, Windows PowerShell lo notifica inmediatamente mediante un mensaje de error. Sin embargo, si se produce un error en el trabajo cuando el Programador de tareas intenta ejecutarlo, el error no está disponible para Windows PowerShell.

    Use los métodos siguientes para detectar y corregir errores en el trabajo.

    • -- Compruebe si hay errores en el registro de eventos del Programador de tareas. Para comprobar el registro, use el Visor de eventos o un comando de Windows PowerShell como el siguiente:

              Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational | Where {$_.Message -like "*fail*"}
      
    • Compruebe el registro de trabajos en el Programador de tareas. Los trabajos programados de Windows PowerShell se almacenan en la siguiente carpeta del Programador de tareas:

              Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs
      
  • -- El trabajo programado podría no ejecutarse debido a un permiso insuficiente.

    Los trabajos programados se ejecutan con los permisos del usuario que creó el trabajo o con los permisos del usuario que se especifica mediante el parámetro Credential del comando Register-ScheduledJob o Set-ScheduledJob.

    Si ese usuario no tiene permiso para ejecutar los comandos o los scripts, se produce un error en el trabajo.

NO SE PUEDE OBTENER EL TRABAJO PROGRAMADO: EL TRABAJO PROGRAMADO ESTÁ DAÑADO

En raras ocasiones, los trabajos programados pueden dañarse o contener contradicciones internas que no se pueden resolver. Normalmente, esto sucede cuando los archivos XML del trabajo programado se editaron manualmente, lo que produce XML no válido.

Cuando un trabajo programado está dañado, Windows PowerShell trata de eliminar el trabajo programado, su historial de ejecución y sus resultados del disco.

Si no puede quitar el trabajo programado, obtendrá un mensaje de error de trabajo dañado cada vez que ejecute el cmdlet Get-ScheduledJob.

Para quitar un trabajo programado dañado, use uno de los métodos siguientes.

  • -- Elimine el directorio <ScheduledJobName> del trabajo programado. No elimine el directorio ScheduledJob.

    El directorio se encuentra en $env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs\<ScheduledJobName>

    Por lo general:

           C:\Users\<UserName>\AppData\Local\Microsoft\Windows\PowerShell
             \ScheduledJobs\<ScheduledJobName>.
    
  • -- Use el Programador de tareas para eliminar el trabajo programado. Las tareas programadas de Windows PowerShell aparecen en la siguiente ruta de acceso del Programador de tareas:

           Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs\<ScheduledJobName>
    

LOS CMDLETS JOB NO ENCUENTRAN LOS TRABAJOS PROGRAMADOS DE MANERA COHERENTE

Cuando el módulo PSScheduledJob no se encuentra en la sesión actual, los cmdlets Job no pueden obtener los trabajos programados, iniciarlos u obtener sus resultados.

Para importar el módulo PSScheduledJob, escriba "Import-Module PSScheduledJob", o bien ejecute u obtenga cualquier cmdlet del módulo, como el cmdlet Get-ScheduledJob. A partir de Windows PowerShell 3.0, los módulos se importan automáticamente al obtener o usar cualquier cmdlet del módulo.

Cuando el cmdlet PSScheduledJob no se encuentra en la sesión actual, la siguiente secuencia de comandos es posible.

            PS C:\> Get-Job ProcessJob

            Get-Job : The command cannot find the job because the job name
            ProcessJob was not found. 
            Verify the value of the Name parameter, and then try the command again.
            + CategoryInfo          : ObjectNotFound: (ProcessJob:String) [Get-Job],
            PSArgumentException
            + FullyQualifiedErrorId : JobWithSpecifiedNameNotFound,Microsoft.PowerShell.
            Commands.GetJobCommand

            PS C:\> Get-Job
            PS C:\> Get-ScheduledJob ProcessJob

            Id         Name            Triggers        Command      Enabled
            --         ----            --------        -------      -------
            4          ProcessJob      {1}             Get-Process  True

            PS C:\> Get-Job ProcessJob

            Id     Name         PSJobTypeName   State       HasMoreData     Location
            --     ----         -------------   -----       -----------     --------
            43     ProcessJob   PSScheduledJob  Completed   True            localhost
            44     ProcessJob   PSScheduledJob  Completed   True            localhost
            45     ProcessJob   PSScheduledJob  Completed   True            localhost
            46     ProcessJob   PSScheduledJob  Completed   True            localhost
            47     ProcessJob   PSScheduledJob  Completed   True            localhost
            48     ProcessJob   PSScheduledJob  Completed   True            localhost
            49     ProcessJob   PSScheduledJob  Completed   True            localhost
            50     ProcessJob   PSScheduledJob  Completed   True            localhost

Este comportamiento se produce porque el comando Get-ScheduledJob importa automáticamente el módulo PSScheduledJob y, a continuación, ejecuta el comando.

VEA TAMBIÉN

about_Scheduled_Jobs

about_Scheduled_Jobs_Basics

about_Scheduled_Jobs_Advanced