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